VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > sql数据库 >
  • sql语句大全之ODBC 中的错误处理

ODBC 中的错误处理
ODBC 中的错误是使用来自每个 ODBC 函数调用的返回值和 SQLError 函数或 SQLGetDiagRec 函数的返回值进行报告的。SQLError 函数用于 ODBC 版本 3 之前的版本(但不包括版本 3)。自版本 3 起,已不建议使用 SQLError 函数,此函数已被 SQLGetDiagRec 函数取代。
每个 ODBC 函数都返回一个 SQLRETURN,它是以下状态代码之一:
状态代码 说明
SQL_SUCCESS 无错误。
SQL_SUCCESS_WITH_INFO 该函数完成,但是对 SQLError 的调用将显示警告。 这种状态最常见的情况是:返回的值太长,应用程序提供的缓冲区不够用。
SQL_ERROR 函数未完成,因为出现了错误。调用 SQLError 可获取有关此问题的详细信息。
SQL_INVALID_HANDLE 作为参数传递的环境、连接或语句句柄无效。 如果在释放句柄后再使用该句柄,或者句柄为空值指针,则通常会发生这种情况。
SQL_NO_DATA_FOUND 没有可用信息。 使用这种状态的最常见情况是在从游标进行读取时,这种状态表示游标中没有更多行。
SQL_NEED_DATA 参数需要数据。 这是一项高级特性,SQLParamData 和 SQLPutData 下面的 ODBC SDK 文档对其作了说明。
该函数完成,但是对 SQLError 的调用将显示警告。
这种状态最常见的情况是:返回的值太长,应用程序提供的缓冲区不够用。
作为参数传递的环境、连接或语句句柄无效。
如果在释放句柄后再使用该句柄,或者句柄为空值指针,则通常会发生这种情况。
没有可用信息。
使用这种状态的最常见情况是在从游标进行读取时,这种状态表示游标中没有更多行。
参数需要数据。
这是一项高级特性,SQLParamData 和 SQLPutData 下面的 ODBC SDK 文档对其作了说明。
每个环境、连接和语句句柄都可能有与之相关联的一个或多个错误或警告。每个对 SQLError 或 SQLGetDiagRec 的调用都会返回有关一个错误的信息,然后删除有关该错误的信息。如果您不调用 SQLError 或 SQLGetDiagRec 来删除所有错误,则会在执行下一个将同一句柄作为参数来传递的函数调用时,删除这些错误。
每个对 SQLError 的调用都会传递三个句柄,这些句柄分别用于环境、连接和语句。第一个调用使用 SQL_NULL_HSTMT 获取与连接相关联的错误。同样,使用 SQL_NULL_DBC 和 SQL_NULL_HSTMT 的调用将获取任何与环境句柄相关联的错误。
每个对 SQLGetDiagRec 的调用将传递环境、连接或语句句柄。第一个调用传递句柄类型 SQL_HANDLE_DBC 以获取与连接关联的错误。第二个调用传递句柄类型 SQL_HANDLE_STMT,以获取与刚执行的语句相关联的错误。
如果有要报告的错误(不是 SQL_ERROR),SQLError 和 SQLGetDiagRec 将返回 SQL_SUCCESS;如果没有其它要报告的错误,则将返回 SQL_NO_DATA_FOUND。
折叠/展开部分
折叠/展开部分
以下代码段使用了 SQLError,并返回代码:
  /* Declare required variables */ SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retcode; UCHAR errmsg[100]; /* Code omitted here */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt ); if( retcode == SQL_ERROR ){ SQLError( env, dbc, SQL_NULL_HSTMT, NULL, NULL, errmsg, sizeof(errmsg), NULL ); /* Assume that print_error is defined */ print_error( "Allocation failed", errmsg ); return; } /* Delete items for order 2015 */ retcode = SQLExecDirect( stmt, "DELETE FROM SalesOrderItems WHERE ID=2015", SQL_NTS ); if( retcode == SQL_ERROR ) { SQLError( env, dbc, stmt, NULL, NULL, errmsg, sizeof(errmsg), NULL ); /* Assume that print_error is defined */ print_error( "Failed to delete items", errmsg ); return; }
折叠/展开部分
折叠/展开部分
以下代码段使用了 SQLGetDiagRec,并返回代码:
  /* Declare required variables */ SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retcode; SQLSMALLINT errmsglen; SQLINTEGER errnative; UCHAR errmsg[255]; UCHAR errstate[5]; /* Code omitted here */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt ); if( retcode == SQL_ERROR ){ SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, errstate, &errnative, errmsg, sizeof(errmsg), &errmsglen); /* Assume that print_error is defined */ print_error( "Allocation failed", errstate, errnative, errmsg ); return; } /* Delete items for order 2015 */ retcode = SQLExecDirect( stmt, "DELETE FROM SalesOrderItems WHERE ID=2015", SQL_NTS ); if( retcode == SQL_ERROR ) { SQLGetDiagRec(SQL_HANDLE_STMT, stmt, recnum, errstate, &errnative, errmsg, sizeof(errmsg), &errmsglen); /* Assume that print_error is defined */ print_error("Failed to delete items", errstate, errnative, errmsg ); return; }


相关教程