异常处理

如果ACCI方法执行失败则会产生一个异常。因为ACCI使用C++标准模板库(STL),因此ACCI方法也可以引发STL可以引发的任何异常。这个异常的类型是SQLException。

SQLException类包含神通特定的错误号和消息。它是从标准异常类派生的,所以它也可以通过使用exception::what()方法获得错误文本。

此外,SQLException类有两个方法可以用来获取错误信息。getErrorCode()方法返回神通错误号。SQLException::what()返回的错误文本可以通过getMessage()方法获得。getMessage()方法返回一个STL字符串,这样它就可以像其他STL字符串一样被复制。

基于错误处理策略,您可以选择以不同于标准异常的方式处理ACCI异常,或者您可以选择不区分两者。

如果您认为区分ACCI异常和标准异常并不重要,那么您的catch块可以如下:

catch (exception &excp)

{

   cerr << excp.what() << endl;

}

如果你决定以不同于标准异常的方式处理ACCI异常,你的catch块可能看起来像这样:

catch (SQLException &sqlExcp)

{

   cerr <<sqlExcp.getErrorCode << ": " << sqlExcp.getErrorMessage() << endl;

}

catch (exception &excp)

{

   cerr << excp.what() << endl;

}

在前面的catch块中,SQL异常由第一个块捕获,非SQL异常由第二个块捕获。如果这两个块的顺序颠倒,就永远不会捕获SQL异常。因为SQLException是从标准异常派生而来的,所以标准异常捕获块也会处理SQL异常。

处理空值和截断数据

通常,当使用ResultSet类或Statement类的getxxx()方法检索的数据值为NULL或truncated时,ACCI不会引起异常。但是,可以通过调用setErrorOnNull()方法或setErrorOnTruncate()方法来改变这种行为。如果在causeException=TRUE的情况下调用setErrorxxx()方法,那么当数据值为NULL或被截断时,会引发SQLException。

默认行为是不引发SQLException。一个列或参数值也可以是NULL,通过调用返回TRUE的ResultSet或Statement对象的isNull()来确定:

rs->isNull(columnIndex);

stmt->isNull(paramIndex);

如果列或参数值被截断,它也返回TRUE,这是由对ResultSet或Statement对象的isTruncated()调用决定的:

rs->isTruncated(columnIndex);

stmt->isTruncated(paramIndex);