मैट की थोड़ी सी मदद से, मैं यह पता लगाने में सक्षम था कि समस्या क्या थी, लेकिन चूंकि उन्होंने इसे उत्तर के रूप में नहीं दिया था, इसलिए मुझे इसका उत्तर देना होगा ताकि इसे उन लोगों के लिए साझा किया जा सके जिनके पास समस्या है। एक ही समस्या, और उत्तर के रूप में चिह्नित करने के लिए भी।
तो, मेरी समस्या यह थी कि मैं डेटाबेस से कनेक्ट नहीं हो सका। जैसा कि मैट ने सुझाव दिया था, मुझे विस्तारित त्रुटि जानकारी का उपयोग करना चाहिए, जिसे SQLGetDiagRec
के रूप में जाना जाता है और दस्तावेज़ीकरण के अनुसार तर्कों को भी ठीक करें। मुझे यह जानने में थोड़ा समय लगा कि SQLGetDiagRec
. कैसे फ़ंक्शन काम करता है, लेकिन एक बार जब मैं wchar_t
. को कनवर्ट करने में कामयाब रहा करने के लिए char *
मैं उस त्रुटि को देख पा रहा था जो यह उत्पन्न कर रहा था।
कनेक्शन प्रयास ने मुझे त्रुटि दी Data source not found and no default driver specified
. इससे मुझे एक सुराग मिला, यह दर्शाता है कि मैंने या तो गलत कनेक्शन स्ट्रिंग लिखी है या टेक्स्ट स्ट्रिंग को किसी तरह गलत व्याख्या या खराब कर दिया गया था।
कुछ नेट पर खोज कर मुझे अंतर्दृष्टि दी कि स्ट्रिंग का गलत अर्थ निकाला गया था, और इसे ठीक करने के लिए मुझे इसे एक शाब्दिक स्ट्रिंग बनाना पड़ा। निश्चित रूप से पर्याप्त है, स्ट्रिंग के सामने L लगाने से यह हल हो गया!
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);
साथ ही, मैंने सीखा कि प्रॉम्प्ट से कैसे छुटकारा पाया जाए, जो शुरुआती समस्या को ठीक करने के बाद पता लगाना काफी आसान था। विंडो हैंडल के लिए शून्य निर्दिष्ट करें, ड्राइवर पूर्णता को SQL_DRIVER_COMPLETE
पर सेट करें और सुनिश्चित करें कि आप कनेक्शन स्ट्रिंग में आवश्यक सभी जानकारी जोड़ते हैं।
तो, अगली समस्या मेरे पास SQLExecDirect
के साथ क्वेरी के साथ थी Syntax error or access violation
saying कहते हुए एक त्रुटि दे रहा था . समस्या स्पष्ट रूप से कनेक्शन स्ट्रिंग के समान ही थी। निश्चित रूप से पर्याप्त
retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT TEST_STRING, TEST_INTEGER, TEST_FLOAT FROM dbo.testfire", SQL_NTS);
एक आकर्षण की तरह काम किया।
यह कोड पूरी तरह से, पूरी तरह कार्यात्मक है:
#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;
}
बस दिखाने के लिए जाता है, यहां तक कि छोटी से छोटी चीज भी सब कुछ विफल कर सकती है।
आपकी मदद के लिए धन्यवाद मैट।