错误后可以使用ODBC语句吗(有效)?

omusil

例如SQLExecute使用命令的命令失败后,是否可以再次使用ODBC语句句柄(即,它是否有效)(不返回SQL_SUCCESS或SQL_SUCCESS_WITH_INFO)

并且这可能是特定于DBMS /驱动程序的吗?

我在ODBC程序员的参考上找不到有关此的任何信息

非常

我也没有在文档中找到任何权威性的答案。但是我会说:是的-可以,除了返回的错误代码是SQL_INVALID_HANDLE

推理:

  1. 要求语句句柄作为参数的函数文档中,没有任何关于在发生错误的情况下使句柄无效的内容。重要的是返回码。因此,如果没有明确禁止它,它应该可以工作。

  2. 如果返回SQL_ERROR,则可以使用相同的语句句柄来获取有关该错误的更多信息。因此,语句句柄仍然具有有效的上下文。

    3:即使在返回SQL_ERROR的情况下,我们也一次又一次使用同一条语句。到目前为止,我们没有任何问题。好吧,但是大多数情况下我们没有任何错误。

在有关“语句已终止”的注释之后更新:是的,您可以重新使用相同的语句句柄。该错误仅表示服务器正在终止当前正在运行的语句。请参见以下示例,该示例会产生这样的错误,然后再次使用相同的语句来成功插入:

#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <sql.h>
#include <sqlext.h>
#include <sqlucode.h>

void printErr(SQLHANDLE handle, SQLSMALLINT handleType)
{
    SQLSMALLINT recNr = 1;
    SQLRETURN ret = SQL_SUCCESS;
    while (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    {
        SQLWCHAR errMsg[SQL_MAX_MESSAGE_LENGTH + 1];
        SQLWCHAR sqlState[5 + 1];
        errMsg[0] = 0;
        SQLINTEGER nativeError;
        SQLSMALLINT cb = 0;
        ret = SQLGetDiagRec(handleType, handle, recNr, sqlState, &nativeError, errMsg, SQL_MAX_MESSAGE_LENGTH + 1, &cb);
        if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
        {
            std::wcerr << L"ERROR; native: " << nativeError << L"; state: " << sqlState << L"; msg: " << errMsg << std::endl;
        }
        ++recNr;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    // connect to db
    SQLRETURN   nResult = 0;
    SQLHANDLE   handleEnv = 0;

    nResult = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, (SQLHANDLE*)&handleEnv);
    nResult = SQLSetEnvAttr(handleEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3_80, SQL_IS_INTEGER);

    SQLHANDLE   handleDBC = 0;
    nResult = SQLAllocHandle(SQL_HANDLE_DBC, handleEnv, (SQLHANDLE*)&handleDBC);

    SQLWCHAR     strConnect[256] = L"Driver={SQL Server};Server=.\\INSTANCE;Database=Test;Trusted_Connection=yes;";
    SQLWCHAR     strConnectOut[1024] = { 0 };
    SQLSMALLINT nNumOut = 0;
    nResult = SQLDriverConnect(handleDBC, NULL, (SQLWCHAR*)strConnect, SQL_NTS, (SQLWCHAR*)strConnectOut, sizeof(strConnectOut), &nNumOut, SQL_DRIVER_NOPROMPT);
    if (!SQL_SUCCEEDED(nResult))
        printErr(handleDBC, SQL_HANDLE_DBC);

    SQLHSTMT    handleStatement = SQL_NULL_HSTMT;
    nResult = SQLAllocHandle(SQL_HANDLE_STMT, handleDBC, (SQLHANDLE*)&handleStatement);
    if (!SQL_SUCCEEDED(nResult))
        printErr(handleDBC, SQL_HANDLE_DBC);

    // try to drop table Wallet, ignore if it exists
    nResult = SQLExecDirect(handleStatement, L"DROP TABLE Wallet", SQL_NTS);

    // create table Wallet
    nResult = SQLExecDirect(handleStatement, L"CREATE TABLE Wallet (WalletID int NOT NULL,  Name nvarchar(5) NOT NULL)", SQL_NTS);
    if (!SQL_SUCCEEDED(nResult))
            printErr(handleStatement, SQL_HANDLE_STMT);

    // Create a query that fails with data truncation and statement got terminated error:
    nResult = SQLExecDirect(handleStatement, L"INSERT INTO Wallet (WalletID, Name) VALUES (1, 'SomethingTooLong')", SQL_NTS);
    if (!SQL_SUCCEEDED(nResult))
        printErr(handleStatement, SQL_HANDLE_STMT);

    // and now run a query on the same statement and check in the db: Has been inserted just fine
    nResult = SQLExecDirect(handleStatement, L"INSERT INTO Wallet (WalletID, Name) VALUES (2, 'Fan')", SQL_NTS);
    if (!SQL_SUCCEEDED(nResult))
        printErr(handleStatement, SQL_HANDLE_STMT);
    // actually we should now free all handles properly...
    return 0;
}

该程序的输出为:

错误; 母语:8152; 状态:22001;msg:[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]字符串或二进制数据将被截断。错误; 本地人:3621; 状态:01000;msg:[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]该语句已终止。

但是,使用该语句成功执行的最后一个没有错误的插入查询已成功执行:检入数据库,查看是否已插入行(并且SQLExecDirect没有返回任何错误)。

有关SQL_INVALID_HANDLE的信息,请参见此处:https ://msdn.microsoft.com/zh-cn/library/ms716219( v= vs.85).aspx

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过简单对象定义JavaScript对象原型是否有效-我可以使用这种语法吗?

来自分类Dev

我可以使用Scheme有效地实施快速排序吗?

来自分类Dev

我可以使此宏更有效或更快速吗?

来自分类Dev

是否可以使用Ruby或Python禁用锚/引用来发出有效的YAML?

来自分类Dev

是否可以使用静态字典创建有效的gzip?

来自分类Dev

switch语句可以使用变量吗?

来自分类Dev

常量表达式在VHDL case语句中可以有效吗?

来自分类Dev

Android-使用静态字段是否可以使活动重新启动仍然有效?

来自分类Dev

以下语句在ANSI C中有效吗?真的有效吗?

来自分类Dev

Laravel条件语句:when()有效吗?

来自分类Dev

是否可以使用有效负载调用AWS Lambda函数以使Alexa说话?

来自分类Dev

我可以使用更有效的查询吗

来自分类Dev

当可以在stdout中立即报告String时,它是有效的错误类型吗?

来自分类Dev

可以使用多线程来使这种矩阵向量乘法算法更有效吗?

来自分类Dev

什么是有效的AWSPhone?可以使用哪些测试值?

来自分类Dev

我可以使for循环中的for循环更有效吗?

来自分类Dev

接口是构造函数中的唯一参数-可以使它更好/更有效吗?

来自分类Dev

我可以使用type来检查任意名称是否是有效的命令名称吗?

来自分类Dev

使用Java套接字时可以保证数据有效性吗?

来自分类Dev

链接列表-有效使用吗?

来自分类Dev

是否可以使用Keytool生成具有较长有效性的CSR

来自分类Dev

这种对alloca()的使用有效吗?

来自分类Dev

switch语句可以使用变量吗?

来自分类Dev

“ SSH虚拟信息亭”。“ PermitEmptyPasswords yes”有效吗?-如何使ssh用户使用空密码,以便随机用户可以使用它?

来自分类Dev

我可以使用gethttpsforfree为locahost或Intranet域创建有效的证书吗?

来自分类Dev

删除后可以使用指针吗?

来自分类Dev

我可以使此SQL查询更有效吗?

来自分类Dev

可以使用Factory Girl来有效地创建持久性测试数据/工件以用于其他测试吗?

来自分类Dev

Python - 有效语句的语法错误

Related 相关文章

  1. 1

    通过简单对象定义JavaScript对象原型是否有效-我可以使用这种语法吗?

  2. 2

    我可以使用Scheme有效地实施快速排序吗?

  3. 3

    我可以使此宏更有效或更快速吗?

  4. 4

    是否可以使用Ruby或Python禁用锚/引用来发出有效的YAML?

  5. 5

    是否可以使用静态字典创建有效的gzip?

  6. 6

    switch语句可以使用变量吗?

  7. 7

    常量表达式在VHDL case语句中可以有效吗?

  8. 8

    Android-使用静态字段是否可以使活动重新启动仍然有效?

  9. 9

    以下语句在ANSI C中有效吗?真的有效吗?

  10. 10

    Laravel条件语句:when()有效吗?

  11. 11

    是否可以使用有效负载调用AWS Lambda函数以使Alexa说话?

  12. 12

    我可以使用更有效的查询吗

  13. 13

    当可以在stdout中立即报告String时,它是有效的错误类型吗?

  14. 14

    可以使用多线程来使这种矩阵向量乘法算法更有效吗?

  15. 15

    什么是有效的AWSPhone?可以使用哪些测试值?

  16. 16

    我可以使for循环中的for循环更有效吗?

  17. 17

    接口是构造函数中的唯一参数-可以使它更好/更有效吗?

  18. 18

    我可以使用type来检查任意名称是否是有效的命令名称吗?

  19. 19

    使用Java套接字时可以保证数据有效性吗?

  20. 20

    链接列表-有效使用吗?

  21. 21

    是否可以使用Keytool生成具有较长有效性的CSR

  22. 22

    这种对alloca()的使用有效吗?

  23. 23

    switch语句可以使用变量吗?

  24. 24

    “ SSH虚拟信息亭”。“ PermitEmptyPasswords yes”有效吗?-如何使ssh用户使用空密码,以便随机用户可以使用它?

  25. 25

    我可以使用gethttpsforfree为locahost或Intranet域创建有效的证书吗?

  26. 26

    删除后可以使用指针吗?

  27. 27

    我可以使此SQL查询更有效吗?

  28. 28

    可以使用Factory Girl来有效地创建持久性测试数据/工件以用于其他测试吗?

  29. 29

    Python - 有效语句的语法错误

热门标签

归档