2016-09-14 169 views
1

我一直在嘗試使用odbc插入記錄到sql server數據庫,但有一些問題。下面的程序是在Visual Studio上使用控制檯C++的代碼。無法插入數據到SQL Server數據庫ODBC C++

#include "stdafx.h" 
#include <iostream> 
#include <Windows.h> 
#include <sqltypes.h> 
#include <sql.h> 
#include <sqlext.h> 

using namespace std; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    RETCODE rc; 
    HENV henv; 
    HDBC hdbc; 
    HSTMT hstmt; 
    SDWORD cdData; 

    cout << "Attempting Connection " << endl; 

    SQLAllocEnv(&henv); 
    SQLAllocConnect(henv, &hdbc); 
    rc = SQLConnect(hdbc, L"DatasourceTest", SQL_NTS, 0, SQL_NTS, 0, SQL_NTS); 

    if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO)) 
    { 
     cout << "Cannot open database -- make sure ODBC is confugured properly." << endl; 
     SQLFreeConnect(hdbc); 
     SQLFreeEnv(henv); 
     cout << "Press ENTER to continue." << endl; 
     cin.get(); 
     return 1; 
    } 
    else 
    { 
     cout << "Connected -- ODBC is confugured properly." << endl; 
    } 

    //Create a SQL statement 




    UCHAR szSqlStr[] = "INSERT INTO PERSONS (FirstName, LastName) VALUES ('Jack', 'Benson')"; 
    cout << "Executing " << szSqlStr << endl; 
    rc = SQLAllocStmt(hdbc, &hstmt); 
    rc = SQLPrepare(hstmt, (SQLWCHAR*)szSqlStr, sizeof(szSqlStr)); 
    rc = SQLExecute(hstmt); 

    cout << "rc" << rc << endl; 
    cout << "SQL_SUCCESS" << SQL_SUCCESS << endl; 
    cout << "SQL_SUCCESS_WITH_INFO" << SQL_SUCCESS_WITH_INFO << endl; 



    if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO)) 
    { 
     //ERROR 
     SQLWCHAR sqlState[8]; 
     SQLWCHAR msgText[1024]; 
     SQLINTEGER NativeErrorPtr; 
     SQLSMALLINT TextLengthPtr; 
     SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlState, &NativeErrorPtr, msgText, sizeof(msgText), &TextLengthPtr); 

     SQLFreeStmt(hstmt, SQL_DROP); 
     SQLDisconnect(hdbc); 
     SQLFreeConnect(hdbc); 
     SQLFreeEnv(henv); 
     cout << "Error " << endl << msgText << endl; 
     cout << "Press ENTER to continue." << endl; 


    } 


    cin.get(); 
    return 0; 
} 

enter image description here

我已經在這個線程附加程序的輸出。返回的RETCODE爲-1,在屏幕截圖中顯示此錯誤。我無法將任何記錄插入到數據庫中。與數據庫的連接沒問題。每次程序執行時,錯誤代碼都是不同的。

+0

我會嘗試'SQLExecDirect'來代替。 (因爲聲明沒有參數。) – jarlh

+0

我已經嘗試使用SQLExecDirect,但事實證明具有相同的錯誤。 –

回答

0

主要錯誤是您將ANSI字符串傳遞給unicode版本的SQLPrepare。

UCHAR szSqlStr[] = "INSERT INTO PERSONS (FirstName, LastName) VALUES ('Jack', 'Benson')"; 
... 
rc = SQLPrepare(hstmt, (SQLWCHAR*)szSqlStr, sizeof(szSqlStr)); 

將程序的字符集更改爲ANSI或將請求字符串轉換爲unicode。你也應該考慮到最後一個參數在符號長度不是字節