Dengan sedikit bantuan dari Mat, saya dapat mengetahui apa masalahnya, tetapi karena dia tidak memberikannya dalam bentuk jawaban, saya harus menjawabnya sehingga dapat dibagikan kepada mereka yang memiliki masalah yang sama, dan juga untuk menandai sebagai telah dijawab.
Jadi, masalah saya adalah saya tidak dapat terhubung ke database. Seperti yang disarankan Mat, saya harus menggunakan info kesalahan yang diperluas, yang dikenal sebagai SQLGetDiagRec
dan juga perbaiki argumen sesuai dengan dokumentasi. Butuh beberapa saat untuk mempelajari cara SQLGetDiagRec
fungsi berfungsi, tetapi setelah saya berhasil mengonversi wchar_t
ke char *
Saya dapat melihat kesalahan yang dihasilkannya.
Upaya koneksi memberi saya kesalahan Data source not found and no default driver specified
. Itu memberi saya petunjuk, yang menunjukkan bahwa saya menulis string koneksi yang salah atau string teks entah bagaimana disalahartikan atau rusak.
Melakukan beberapa mencari di internet memberi saya wawasan bahwa string itu disalahartikan, dan untuk memperbaikinya saya harus menjadikannya string literal. Tentunya cukup, menempatkan L di depan string menyelesaikannya!
retcode = SQLDriverConnect(hdbc, 0,
(SQLWCHAR*)L"DSN=TestConnection;SERVER=localhost;UID=user;PWD=password;DRIVER=MySQL Server;",
_countof(L"DSN=TestConnection;SERVER=localhost;UID=user;PWD=password;DRIVER=MySQL Server;"),
OutConnStr, 255, &OutConnStrLen, SQL_DRIVER_COMPLETE);
Pada saat yang sama, saya belajar cara menghilangkan prompt, yang cukup mudah diketahui setelah memperbaiki masalah awal. Tentukan null untuk pegangan jendela, setel penyelesaian driver ke SQL_DRIVER_COMPLETE
dan pastikan Anda menambahkan semua informasi yang diperlukan dalam string koneksi.
Jadi, masalah berikutnya yang saya miliki dengan kueri dengan SQLExecDirect
memberikan kesalahan yang mengatakan Syntax error or access violation
. Masalahnya jelas sama dengan string koneksi. Pasti cukup
retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);
Bekerja seperti pesona.
Berikut kode secara keseluruhan, berfungsi penuh:
#include <iostream>
#include <windows.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <string>
using namespace std;
int main(){
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLWCHAR OutConnStr[255];
SQLSMALLINT OutConnStrLen;
// Allocate environment handle
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set the ODBC version environment attribute
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// Allocate connection handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// Set login timeout to 5 seconds
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
// Connect to data source
retcode = SQLDriverConnect(
hdbc,
0,
(SQLWCHAR*)L"DSN=TestConnection;SERVER=localhost;UID=root;PWD=never140;DRIVER=MySQL Server;",
_countof(L"DSN=TestConnection;SERVER=localhost;UID=root;PWD=never140;DRIVER=MySQL Server;"),
OutConnStr,
255,
&OutConnStrLen,
SQL_DRIVER_COMPLETE );
// Allocate statement handle
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// Process data
retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);
if (retcode == SQL_SUCCESS) {
SQLINTEGER sTestInt, cbTestStr, cbTestInt, cbTestFloat, iCount = 1;
SQLFLOAT dTestFloat;
SQLCHAR szTestStr[200];
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
cout<<"An error occurred";
}
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
SQLGetData(hstmt, 1, SQL_C_CHAR, szTestStr, 200, &cbTestStr);
SQLGetData(hstmt, 2, SQL_C_ULONG, &sTestInt, 0, &cbTestInt);
SQLGetData(hstmt, 3, SQL_C_DOUBLE, &dTestFloat, 0,&cbTestFloat);
/* Print the row of data */
cout<<"Row "<<iCount<<":"<<endl;
cout<<szTestStr<<endl;
cout<<sTestInt<<endl;
cout<<dTestFloat<<endl;
iCount++;
} else {
break;
}
}
}else{
cout<<"Query execution error."<<endl;
}
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
}else{
cout<<"Connection error"<<endl;
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
system("pause");
return 0;
}
Hanya untuk menunjukkan, bahkan hal terkecil pun bisa membuat semuanya gagal.
Terima kasih Mat atas bantuan Anda.