2016-03-07 117 views
0

我最近發送了一些工作代碼從我的筆記本電腦到我的桌面。即使他們都使用相同的技術(Visual Studio社區15和SQL Server 14),我無法連接到桌面上的數據庫。ODBC連接未打開

我在這兩個上都有一個相同的ODBC驅動程序(並嘗試過我的桌面上的各種組合)。同時控制從ODBC到SQL Server似乎不錯,但連接當我運行從調試器中我的應用程序收到此錯誤:

Message: [Microsoft][ODBC Driver Manager] Connection Not Open

SQLSTATE: 08003 Failed to connect

這是代碼:

#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連接。

+0

嘗試檢查「SQLDriverConnect」的返回值,並在建立連接失敗時獲取錯誤信息。通常,這些錯誤消息包含相當有用的信息來縮小問題的範圍。 – erg

+0

@erg這不正是我正在通過發送dbc到cout做什麼? – geostocker

+0

不,與'SQLDriverConnect'一致,你不檢查返回值。您應該已經在那裏獲得了一個'SQL_ERROR',然後您可以將連接句柄提供給錯誤函數。 – erg

回答

0

對於將來可能會遇到此問題的人員;確保您的SQL Server配置管理器中啓用了TCP/IP。

在我的情況下,上述被禁用,連接字符串中缺少「Server =」。

2

這可能是由於windows版本問題。您的筆記本電腦可能在64位操作系統上運行,您的桌面可能在32位操作系統上運行。使用32位odbc數據源管理員在桌面上創建一個新的DSN,然後重試。代碼沒有任何問題

+0

我確實認爲這可能是一個解決方案;看着我的筆記本電腦上的ODBC,它顯示它是32/64位,而在桌面上沒有任何問題。 但是,我試過運行ODBC管理的32位版本,並沒有在它旁邊添加64/32位戳。我也試圖在SQL Server,Native Server和ODBC下運行該應用程序。 使用32位ODBC管理是通過使用「運行」和(在我的情況下)c:\ Windows \ SysWOW64 \ odbcad32.exe對嗎?或者我錯過任何事情? – geostocker