c++ - sqlbindparameter 未用于所有参数 - mysql 和 C++

标签 c++ mysql odbc

我在 MySQL 中定义了下表

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 notused for allparameters 错误(在下面的 while 循环中检索)。

如果绑定(bind)的参数数量与“?”的数量不同,我会期望这种情况在查询中,但它们是相同的。

有人对问题提出建议吗?

最佳答案

问题中的代码实际上有两个问题。

a) 对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);

关于c++ - sqlbindparameter 未用于所有参数 - mysql 和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373862/

相关文章:

c# - 如何将参数传递给 MySQL OdbcCommand 并且仅当谓词匹配时如何更新?

c++ - Botan 中性能最高的 SQLite 加密编解码器是什么?

c++ - 字符串比较在 Visual C++ 2005 中不起作用

c++ - OpenCV 和最新的 PS3 Eye 驱动程序

c++ - 为什么这个单独的定义会导致错误?

c++ - mysql c++ 连接器,如果连接断开,如何保持连接并重新连接?

c# - 在 C# 中创建自定义 ODBC/OLE 驱动程序

java - 如何通过 Hibernate 在 mysql 中获取枚举类型的所有可能值

mysql - 无法让 mysql 识别在语句中使用的查询

php - 如何使用触发器在 SQL 中递增?