首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误后可以使用ODBC语句(它有效吗)?

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

Stack Overflow用户
提问于 2017-01-16 14:13:47
回答 1查看 503关注 0票数 0

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

这可能是DBMS/驱动程序特有的吗?

我在ODBC程序员参考页面上找不到这方面的任何信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-16 16:44:37

我在医生里也没有找到任何权威的答案。但是我会说:是的,你可以,但返回的错误代码是SQL_INVALID_HANDLE

推理:

  1. 需要语句句柄作为参数的函数的文档中没有提到任何关于句柄在发生错误时失效的内容。重要的是返回代码。所以如果没有明令禁止的话,它应该能起作用。
  2. 在获得返回SQL_ERROR的情况下,可以使用相同的语句句柄获取有关该错误的更多信息。所以语句句柄仍然有一个有效的上下文。 3:我们一次又一次地使用相同的语句,即使在SQL_ERROR返回的情况下也是如此。到目前为止,我们还没有遇到任何问题。但是大多数情况下我们不会犯任何错误..。

更新,在评论“语句已终止”之后:是的,您可以重复使用相同的语句句柄。此错误只是指示当前正在运行的语句已由服务器终止。请参阅下面的示例,该示例生成这样一个错误,然后再次使用相同的语句成功插入:

代码语言:javascript
复制
#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: MicrosoftSQL ServerString或二进制数据将被截断。错误;本机: 3621;状态: 01000;msg: MicrosoftSQL ServerThe语句已终止。

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

关于SQL_INVALID_HANDLE:https://msdn.microsoft.com/en-us/library/ms716219(v=vs.85).aspx,请参阅此处

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41678381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档