【问题标题】:Using ODBC to connect to SQL SERVER 2008使用 ODBC 连接到 SQL SERVER 2008
【发布时间】:2011-07-17 17:41:09
【问题描述】:

我在 W32 机器上尝试与数据库建立连接。为此,我尝试开始测试一个示例程序:

#include <iostream>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>

using namespace std;

void show_error(unsigned int handletype, const SQLHANDLE& handle){
    SQLCHAR sqlstate[1024];
    SQLCHAR message[1024];
    if(SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL))
        cout<<"Message: "<<message<<"\nSQLSTATE: "<<sqlstate<<endl;
}

int main(){

    SQLHANDLE sqlenvhandle;
    SQLHANDLE sqlconnectionhandle;
    SQLHANDLE sqlstatementhandle;
    SQLRETURN retcode;

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle))
        goto FINISHED;

    if(SQL_SUCCESS!=SQLSetEnvAttr(sqlenvhandle,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
        goto FINISHED;

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle))
        goto FINISHED;

    SQLCHAR retconstring[1024];
    switch(SQLDriverConnect (sqlconnectionhandle,
                NULL,
                (SQLCHAR*)"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=MyDatabase;UID=sa;PWD=Admin-123;",
                SQL_NTS,
                retconstring,
                1024,
                NULL,
                SQL_DRIVER_NOPROMPT)){
        case SQL_SUCCESS_WITH_INFO:
            show_error(SQL_HANDLE_DBC, sqlconnectionhandle);
            break;
        case SQL_INVALID_HANDLE:
        case SQL_ERROR:
            show_error(SQL_HANDLE_DBC, sqlconnectionhandle);
            goto FINISHED;
        default:
            break;
    }

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_STMT, sqlconnectionhandle, &sqlstatementhandle))
        goto FINISHED;

    if(SQL_SUCCESS!=SQLExecDirect(sqlstatementhandle, (SQLCHAR*)"select * from testtable", SQL_NTS)){
        show_error(SQL_HANDLE_STMT, sqlstatementhandle);
        goto FINISHED;
    }
    else{
        char name[64];
        char address[64];
        int id;
        while(SQLFetch(sqlstatementhandle)==SQL_SUCCESS){
            SQLGetData(sqlstatementhandle, 1, SQL_C_ULONG, &id, 0, NULL);
            SQLGetData(sqlstatementhandle, 2, SQL_C_CHAR, name, 64, NULL);
            SQLGetData(sqlstatementhandle, 3, SQL_C_CHAR, address, 64, NULL);
            cout<<id<<" "<<name<<" "<<address<<endl;
        }
    }

FINISHED:
    SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle );
    SQLDisconnect(sqlconnectionhandle);
    SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);
    SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle);

}

问题是我在尝试编译时遇到了很多问题,例如未声明的类型:

'SQLHANDLE' has not been declared
'SQLHDESC' was not declared in this scope

我已经链接到 libodbccpp32.alibodbc32.a 库。我做错了什么?

【问题讨论】:

  • 该错误似乎表明您没有包含描述 sqlhandle/sqlhdesc 的 odbc 标头。我认为它在 ntodbc.h 中。
  • 你知道我在哪里可以得到那个标题吗?
  • 看起来那是特定于我正在使用的 Sybase SDK 的。这是微软的列表。 msdn.microsoft.com/en-us/library/ms713603%28v=VS.85%29.aspx。它实际上是 sqltypes.h 那是 microsoft sdk 之一。这是我安装它的位置 C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include。自从您包含该错误后,您的编译错误中是否还有更多详细信息?你包含的路径是什么样的?
  • 实际上几乎所有错误都是从这些错误派生的,并且在某种程度上是相同的(“错误:'SQLHDESC'未在此范围内声明”)。包含路径是 mingw 标头的路径,其中包括其中的每一个。我没有在日志中看到包含文件错误。
  • 事实上,我发现添加标头 stdafx 可以解决这个问题。但问题是我包含路径的顺序(这很奇怪,因为它们在示例中是这样的)。我将包括避免问题的方式

标签: c++ odbc codeblocks


【解决方案1】:

我发现 stdafx.h 标头应该包含顺序:

#include <iostream>
#include <windows.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <sql.h>

【讨论】:

    【解决方案2】:

    只需更改包含这样的声明:

    #include <iostream>
    #include <windows.h>
    #include <sql.h>
    #include <sqltypes.h>
    #include <sqlext.h>
    

    【讨论】:

      【解决方案3】:

      排序头文件无关紧要。只需确保您的项目在其属性中包含以下包含目录:

      C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
      

      在哪里找到(先验):

      windows.h
      sqlext.h
      sqltypes.h
      sql.h
      

      这足以让您的命令被识别和编译没有任何问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 2019-12-12
        • 2016-09-29
        • 1970-01-01
        相关资源
        最近更新 更多