我有一个代码将字符串绑定到看起来像这个
的ODBC语句std::string v = "...";
SQLBindParameter(stmt, c, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
v.size(), 0, &v[0], v.size(), 0)
适用于任何常规字符串,但不适用于空字符串。我收到了一条错误消息:
错误:[Microsoft] [ODBC SQL Server驱动程序]无效的精度值
我将函数调用更改为
SQLBindParameter(stmt, c, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
std::max<SQLUINTEGER>(v.size(), 1), 0, &v[0], v.size(), 0)
现在可以插入空字符串,但它会被转换为空格而不是空字符串。
我不想插入NULL值,因为遇到NULL时,许多SQL语句变得违反直觉。是否可以绑定空字符串?
(数据库引擎是带有ODBC3的SQL Server 2005)
答案 0 :(得分:2)
空字符串和一个空格的字符串在大多数数据库的CHAR字段中都被视为相同,包括SQLServer(例如,参见SQL Server 2008 Empty String vs. Space和MicroSoft解释,这是SQL-92规范的一部分:{{3 }})。
所以你的修改过的电话实际上是正常的。
这与其他人报告在http://support.microsoft.com/kb/316626
解决此问题的方式相同因此,为了允许绑定空(零长度)C字符串,我们需要 只需将其绑定到租赁大小为1的参数。