SQLBindParam:设置 Null 值失败 (ODBC)

Posted

技术标签:

【中文标题】SQLBindParam:设置 Null 值失败 (ODBC)【英文标题】:SQLBindParam: setting Null value fails (ODBC) 【发布时间】:2016-06-08 07:31:53 【问题描述】:

我正在尝试将 NULL 值绑定到 sql 查询中的参数,但执行语句时总是收到错误 HY009 Invalid argument value。这种奇怪的行为只有在我以发布模式构建时才会出现。在调试模式下它工作正常。有什么想法吗?

我的代码:

SQLRETURN nRet = SQLPrepare(m_hStmt, (SQLTCHAR *)strSQL, SQL_NTS); // returns SQL_SUCCESS
SQLINTEGER cbNumeric = SQL_NULL_DATA;
nRet = SQLBindParameter(m_hStmt, 
                parameterIndex,     
                SQL_PARAM_INPUT,    
                SQL_C_CHAR,         
                SQL_LONGVARCHAR,    
                0,                  
                NULL,               
                NULL,       
                0,                  
                &cbNumeric); // returns SQL_SUCCESS
nRet = SQLExecute(m_hStmt); // returns SQL_NEED_DATA
nRet = _SQLParamDataPutData(nRet); // returns Debug: SQL_SUCCESS, Release: SQL_ERROR    

【问题讨论】:

【参考方案1】:

如果我正确理解 https://msdn.microsoft.com/en-us/library/ms710963%28v=vs.85%29.aspx 的文档,则不允许您将 NULL 指针作为 ParameterValuePtr 参数传递 - 即使该值为 NULL 值。

来自文档中的 cmets 部分,关于错误 HY009:

(DM) 参数 ParameterValuePtr 是一个空指针,参数 StrLen_or_IndPtr 是一个空指针,参数 InputOutputType 不是 SQL_PARAM_OUTPUT。

如果您将代码更改为以下内容,它是否有效:

SQLRETURN nRet = SQLPrepare(m_hStmt, (SQLTCHAR *)strSQL, SQL_NTS);
SQLCHAR dummy[1];
dummy[0] = '\0';
SQLINTEGER cbNumeric = SQL_NULL_DATA;
nRet = SQLBindParameter(m_hStmt, 
                parameterIndex,     
                SQL_PARAM_INPUT,    
                SQL_C_CHAR,         
                SQL_LONGVARCHAR,    
                0,                  
                NULL,               
                dummy,       
                SQL_NTS,                  
                &cbNumeric); // returns SQL_SUCCESS
nRet = SQLExecute(m_hStmt); // returns SQL_NEED_DATA
nRet = _SQLParamDataPutData(nRet);

【讨论】:

以上是关于SQLBindParam:设置 Null 值失败 (ODBC)的主要内容,如果未能解决你的问题,请参考以下文章

SQL语法错误:无法将 NULL值插入列'',该列不允许空值。INSERT失败。怎么解决啊

转换为值类型“Int32”失败,因为具体化值为 null

iOS后台返回某些字段值为null的处理

更新布尔值失败,因为在 null 上调用成员函数 update()

Laravel Vue 多张图片上传失败,每个图片都有一个 NULL 值

导入失败null怎么处理