2015-03-31 14 views
0

我已經在MySQL的SQLBindParameter不用於所有參數 - MySQL的&C++

INSERT INTO routemaster_log (`EntryDateTime`,`Entry`,`Message`,`EntryType`) VALUES (?,?,?,?); 
CREATE TABLE `routemaster_log` (
    `EntryDateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `Entry` varchar(127) NOT NULL, 
    `Message` int(11) NOT NULL DEFAULT '0', 
    `EntryType` varchar(20) NOT NULL DEFAULT 'INFORMATION' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

定義如下表和下面的C++代碼寫一個記錄它

void LogEntries::Insert(string_t LogText, string_t LogType, int MessageNumber) 
{ 
    SQLHANDLE hEnv; 
    SQLRETURN retCode; 
    SQLCHAR* query; 
    SQLINTEGER textLength = SQL_NTS; 

    // now set the text to be written to char *  
    char* logText = from_string_t(LogText); 
    char* logType = from_string_t(LogType); 

    std::string SQLQuery("INSERT INTO routemaster_log (`Entry`,`Message`,`EntryType`) VALUES (?,?,?)"); 

    query = (SQLCHAR *)SQLQuery.c_str(); 

. 
. 
. 

    // log Text 
    retCode = SQLBindParameter(hStmnt, 1, SQL_PARAM_INPUT, 
     SQL_C_CHAR, SQL_CHAR, 0, 0, 
     logText, sizeof(logText), &textLength); 

    if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
     std::cout << "SQL Insert failed binding parameters (LogText)" << std::endl; 
    } 

    // Message Number 
    retCode = SQLBindParameter(hStmnt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &MessageNumber, 0, NULL); 
    if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
     std::cout << "SQL Insert failed binding parameters (Message Number)" << std::endl; 
    } 

    // Log Type 
    retCode = SQLBindParameter(hStmnt, 1, SQL_PARAM_INPUT, 
     SQL_C_CHAR, SQL_CHAR, 0, 0, 
     logType, sizeof(logType), &textLength); 

    if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
     std::cout << "SQL Insert failed binding parameters (LogType)" << std::endl; 
    } 

    retCode = SQLExecDirectA(hStmnt, query, SQL_NTS); 
    if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) 
    { 
     SQLWCHAR Msg[255], SqlState[6]; 
     SQLINTEGER NativeError; 
     SQLRETURN ret2; 
     SQLSMALLINT i, MsgLen; 

     i = 1; 
     while ((ret2 = SQLGetDiagRec(SQL_HANDLE_STMT, hStmnt, i, SqlState, &NativeError, 
      Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) { 

      std::cout << Msg << std::endl; 

      i++; 
     } 
     std::cout << "SQL Insert failed writing data to database." << std::endl; 
    } 
} 

一切都很好,直到SQLExecDirectA失敗,SQLBindParameter未用於所有參數錯誤(在以下while循環中檢索)。

我希望如果綁定參數的數量不同於'?'的數量,在查詢中,但它們是相同的。

任何人都有什麼不對的建議嗎?

回答

0

問題中實際存在兩個問題。

一)來電來的SQLBindParameter調用之前轉到SQLPrepareA

b)在呼叫到的SQLBindParameter第二個參數給出的參數

修改後的代碼的位置 - 它的工作原理如下;

// log Text 
retCode = SQLBindParameter(hStmnt, 1, SQL_PARAM_INPUT, 
    SQL_C_CHAR, SQL_CHAR, 0, 0, 
    logText, sizeof(logText), &textLength); 

if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
    std::cout << "SQL Insert failed binding parameters (LogText)" << std::endl; 
} 

// Message Number 
retCode = SQLBindParameter(hStmnt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &MsgNumber, 0, NULL); 
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
    std::cout << "SQL Insert failed binding parameters (Message Number)" << std::endl; 
} 

// Log Type 
retCode = SQLBindParameter(hStmnt, 3, SQL_PARAM_INPUT, 
    SQL_C_CHAR, SQL_CHAR, 0, 0, 
    logType, sizeof(logType), &textLength); 

if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
    std::cout << "SQL Insert failed binding parameters (LogType)" << std::endl; 
} 

retCode = SQLPrepareA(hStmnt, query, SQL_NTS); 
if (retCode != SQL_SUCCESS && retCode != SQL_SUCCESS_WITH_INFO) { 
    std::cout << "SQL Insert failed preparing statement" << std::endl; 
} 


retCode = SQLExecDirectA(hStmnt, query, SQL_NTS); 
相關問題