【问题标题】:ODBC connection not openODBC 连接未打开
【发布时间】:2016-06-21 00:34:32
【问题描述】:

我最近将一些工作代码从我的笔记本电脑发送到我的桌面。即使他们都使用相同的技术(Visual Studio community 15 和 SQL Server 14),我也无法连接到我在桌面上的数据库。

我在两者上都有一个相同的 ODBC 驱动程序(并且在我的桌面上尝试了各种组合)。虽然控制从 ODBC 到 SQL Server 的连接看起来不错,但是当我从调试器运行我的应用程序时,我收到此错误:

消息:[Microsoft][ODBC Driver Manager] 连接未打开

SQLSTATE: 08003 连接失败

这是代码:

#include "stdafx.h"
#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)
{
    SQLWCHAR sqlstate[1024];
    SQLWCHAR message[1024];
    if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL))
        wcout << "Message: " << message << "\nSQLSTATE: " << sqlstate << endl;
}

int main() {

    SQLHENV env;
    SQLHDBC dbc;
    SQLHSTMT stmt;
    SQLRETURN ret;
    SQLSMALLINT columns;
    int row = 0;

    /* Allocate an environment handle */
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    /* We want ODBC 3 support */
    SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
    /* Allocate a connection handle */
    SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);

    /* Connect to the DSN */
    SQLDriverConnectW(dbc, NULL, L"DRIVER={SQL Server};ERA-PC-STUART\\JBK_DB;DATABASE=master;UID=geo;PWD=kalle123;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

    /* Check for success */
    if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt))
    {
        show_error(SQL_HANDLE_DBC, dbc);
        std::cout << "Failed to connect";
    }
    if (SQL_SUCCESS != SQLExecDirectW(stmt, L"select salary from dbo.salary_table", SQL_NTS)) {
        show_error(SQL_HANDLE_STMT, stmt);
    }
    else {
        int id;
        cout << "ID:" << endl;
        while (SQLFetch(stmt) == SQL_SUCCESS) {
            SQLGetData(stmt, 1, SQL_C_ULONG, &id, 0, NULL);
            cout << id << endl;
        }
    }

    return 0;
}

如前所述,代码在我的笔记本电脑上运行完美,但由于某种原因,它无法在桌面上运行 - 即使 ODBC 连接。

【问题讨论】:

  • 尝试检查SQLDriverConnect的返回值,如果建立连接不成功,获取错误信息。通常,这些错误消息包含非常有用的信息来缩小问题范围。
  • @erg 这不正是我将 dbc 发送到 cout 所做的吗?
  • 不,在SQLDriverConnect 的行上你不检查返回值。您应该已经在那里获得了SQL_ERROR,然后您可以将连接句柄提供给错误函数。
  • @era 你介意告诉我怎么做吗?实在想不通……
  • 点赞ret = SQLDriverConnectW(dbc, NULL, L"DRIVER={SQL Server};ERA-PC-STUART\\JBK_DB;DATABASE=master;UID=geo;PWD=kalle123;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE); if(!SQL_SUCCEEDED(ret)) { show_error(SQL_HANDLE_DBC, dbc); }

标签: c++ sql-server visual-studio odbc


【解决方案1】:

这可能是由于 windows 版本问题。您的笔记本电脑可能在 64 位操作系统上运行,而您的台式机可能在 32 位操作系统上运行。使用 32 位 odbc 数据源管理员在桌面新建 DSN,然后重试。代码没有问题

【讨论】:

  • 我确实认为这可能是一个解决方案;在笔记本电脑上查看我的 ODBC,它显示它是 32/64 位的,而在桌面上它没有位。但是,我尝试运行 32 位版本的 ODBC 管理员,但两次都没有在其旁边添加 64/32 位标记。我还尝试在 SQL Server、Native Server 和 ODBC 下运行该应用程序。使用 32 位 ODBC 管理员是通过使用“运行”和(在我的情况下)c:\Windows\SysWOW64\odbcad32.exe 来完成的,对吗?还是我错过了什么?
【解决方案2】:

对于将来可能遇到此问题的人;确保在 SQL Server 配置管理器中启用 TCP/IP。

在我的情况下,上述内容被禁用,并且连接字符串中缺少“Server=”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多