2016-09-14 7 views
1

Я пытался вставить запись в базу данных sql-сервера, используя odbc, но имеющую некоторую проблему. Нижеприведенная программа представляет собой код с помощью консоли 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 в юникодную версию SQLPrepare.

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

Измените набор символов вашей программы на ANSI или включите строку запроса в Юникод. Также вы должны принять во внимание, что последний параметр принимает длину в символах, а не байтах

Смежные вопросы