2017-11-04 26 views
0

:RC2は値を取得する一方SQLDriverConnectをエラーなし診断出力

int DatabaseHelper::ConnectDatabase() 
{ 
    SQLSMALLINT i, MsgLen; 
    SQLWCHAR SqlState[6]; 
    SQLRETURN rc2; 
    SQLINTEGER NativeError[1]; 
    SQLWCHAR Msg[SQL_MAX_MESSAGE_LENGTH]; 
    retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvHandle); 
    if (retCode != SQL_SUCCESS) 
     return retCode; 
    retCode = SQLSetEnvAttr(sqlEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); 
    if (retCode != SQL_SUCCESS) 
     return retCode; 
    retCode = SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvHandle, &sqlConnectionHandle); 
    if (retCode != SQL_SUCCESS) 
     return retCode; 
    retCode = SQLDriverConnect(sqlConnectionHandle, NULL, (SQLWCHAR*)L"Driver={SQL Server Native Client 11.0};Server = 192.168.56.56\SQLEXPRESS;Database = PCTOOLS; Uid = sa; Pwd = delphi2006; ", SQL_NTS, retConString, 1024, NULL, SQL_DRIVER_NOPROMPT); 
    i = 1; 
    rc2 = SQLGetDiagRec(SQL_HANDLE_STMT, sqlConnectionHandle, i, SqlState, NativeError, 
     Msg, sizeof(Msg), &MsgLen); 
    return retCode; 
} 

実行している場合は、RETCODEは、値-1を取得-2。 SqlState、NativeError、またはMsgに返される値はありません(初期化されていない値のままです)。 私はVisual C++ 2015を使用しています。

+0

そして、あなたがCとthat'sa問題を考える++ ? –

答えて

0

Server =の属性は、SQLDriverConnect行で疑わしいと思われます。

Server = 192.168.56.56\\SQLEXPRESS(二重バックスラッシュに注意してください)を使用して、機能に渡そうとしている単一のバックスラッシュをエスケープしてください。

1

正しい方向を指してくれたPhilに感謝します。

サーバー名の単一のバックスラッシュと、接続文字列の属性の間のスペースのために、SQLDriverConnectが失敗しました。

retCode = SQLDriverConnect(sqlConnectionHandle, NULL, (SQLWCHAR*)L"Driver={SQL Server Native Client 11.0};Server=192.168.56.56\\SQLEXPRESS;Database=PCTOOLS;Uid=sa;Pwd=delphi2006;", SQL_NTS, retConString, 1024, &dwLength, SQL_DRIVER_NOPROMPT); 

正しいSQLGetDiagRecの呼び出し:: -

SQLGetDiagRecのは誤ったハンドルタイプに失敗したがSQL_HANDLE_DBC

正しいのSQLDriverConnectコールされている必要があります

rc2 = SQLGetDiagRec(SQL_HANDLE_DBC, sqlConnectionHandle, i, SqlState, NativeError, 
     Msg, sizeof(Msg), &MsgLen); 
関連する問題