使用ODBC连接数据源时出现如图所示的错误,请各位大侠给予指导:

解决方案 »

  1.   

    代码如下:
    SQLRETURN rtcode;
    //Distribute ODBC Environment
    SQLHENV henv;
    rtcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
    if (rtcode!=SQL_SUCCESS)
    {
    //TRACE("Can not allocate env handle \n");
    MessageBox("Can not allocate env handle ","Tips",MB_OK);


    //Version Settings
    rtcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0);
    if (rtcode!=SQL_SUCCESS)
    {
    //TRACE("Can not set ODBC Version\n");
    MessageBox("Can not set ODBC Version","Tips",MB_OK);
    }

    //Distribute Connect Handle
    SQLHDBC hdbc;
    rtcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
    if (rtcode!=SQL_SUCCESS )
    {
    //TRACE("Can not allocate Connect Handle\n");
    MessageBox("Can not allocate Connect Handle","Tips",MB_OK);
    } //Connection Attributes Settings
    rtcode=SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(void*)5,0);
    if (rtcode!=SQL_SUCCESS)
    {
    //TRACE("Error in set connect attribute\n");
    MessageBox("Error in set connect attribute","Tips",MB_OK);
    }

    //Connect the Datasource
    rtcode=SQLConnect(hdbc,(SQLCHAR *)"test",SQL_NTS,
    (SQLCHAR *)"Yamazaki",SQL_NTS,
    (SQLCHAR *)"yamazaki",SQL_NTS);
    // rtcode=SQLConnect(hdbc,(SQLCHAR *)"not",SQL_NTS,NULL,SQL_NTS,NULL,SQL_NTS);
    if (rtcode!=SQL_SUCCESS)
    {
    //TRACE("Error in connect to Datasource\n");
    MessageBox("Error in connect to Datasource","Tips",MB_OK);
    //MessageBox("数据源连接失败!","信息提示",MB_OK); //Deal with Diagnostic Info
    SQLCHAR Sqlstate[6];
    SQLINTEGER NativeError;
    SQLHANDLE hDbConn;
    SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
    int i=1;
    while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA)
    {
    TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg);
    }
    }
    else
    {
    MessageBox("数据源连接成功!","信息提示",MB_OK);
    }
    //Allocate statement handle
    //Process Data
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV,henv);
      

  2.   

    可以运行,就是在连接时弹出错误窗口。我用的开发工具是Visual C++ 6.0,数据库为SQL Server 2000。
      

  3.   

    SQLConnect的时候看看hdbc的值。
      

  4.   

    hdbc的值自始至终都没有变,hDbConn变量的用法对吗?
      

  5.   

    这个地方,如下所示:
    73546B14   cmp         dword ptr [eax],2
      

  6.   

    运行到我标红的部分出的错误,应该是变量hDbConn造成的,可不明白该怎样改。
      

  7.   

           while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA)
            {
                TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg);
            }
    运行到上面的函数时出的错误,hDbConn的值为0xcccccccc。
      

  8.   

    那个hDBConn直接用肯定是不行的,你参考一下这个帖子的连接办法:
    http://topic.csdn.net/t/20021227/18/1306506.html
      

  9.   

    生成诊断纪录所用的函数句柄hDbConn是什么东东?我对它感冒…他的问题跟我的问题不一样,我想看的部分,他给省略了…
      

  10.   

    正确的解决办法…这里的问题是由于条件判断错误导致的,谢谢oldmanzhao的一路帮助!正确的条件判断应该为:
       if (rtcode!=SQL_SUCCESS&&(rtcode!=SQL_SUCCESS_WITH_INFO))
        {
            //TRACE("Error in connect to Datasource\n");
            MessageBox("Error in connect to Datasource","Tips",MB_OK);
            //MessageBox("数据源连接失败!","信息提示",MB_OK);        //Deal with Diagnostic Info
            SQLCHAR Sqlstate[6];
            SQLINTEGER NativeError;
            SQLHANDLE hDbConn;
            SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
            int i=1;
            while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbConn,i,Sqlstate,&NativeError,ErrMsg,sizeof(ErrMsg),NULL)!=SQL_NO_DATA)
            {
                TRACE("Diagnostic:d%,SQLSTATE:%s,NativeError:%d,ErrorMsg:%s\n",i++,Sqlstate,NativeError,ErrMsg);
            }
        }