总结:我正在尝试使用ODBC和SQL Server 2005将文本字符串写入varchar(max)类型的列。如果字符串的长度大于8000,则会失败。帮助!
我有一些C ++代码使用ODBC(SQL Native Client)将文本字符串写入表。如果我将列从varchar(100)更改为varchar(max)并尝试写入长度大于8000的字符串,则写入失败并显示以下错误
[Microsoft] [ODBC SQL Server 驱动程序]字符串数据,右截断
那么,任何人都可以告诉我这是否可以做到,以及如何做到?
一些示例( not production)代码,显示了我正在尝试做的事情:
SQLHENV hEnv = NULL;
SQLRETURN iError = SQLAllocEnv(&hEnv);
HDBC hDbc = NULL;
SQLAllocConnect(hEnv, &hDbc);
const char* pszConnStr = "Driver={SQL Server};Server=127.0.0.1;Database=MyTestDB";
UCHAR szConnectOut[SQL_MAX_MESSAGE_LENGTH];
SWORD iConnectOutLen = 0;
iError = SQLDriverConnect(hDbc, NULL, (unsigned char*)pszConnStr,
SQL_NTS, szConnectOut,
(SQL_MAX_MESSAGE_LENGTH-1), &iConnectOutLen,
SQL_DRIVER_COMPLETE);
HSTMT hStmt = NULL;
iError = SQLAllocStmt(hDbc, &hStmt);
const char* pszSQL = "INSERT INTO MyTestTable (LongStr) VALUES (?)";
iError = SQLPrepare(hStmt, (SQLCHAR*)pszSQL, SQL_NTS);
char* pszBigString = AllocBigString(8001);
iError = SQLSetParam(hStmt, 1, SQL_C_CHAR, SQL_VARCHAR, 0, 0, (SQLPOINTER)pszBigString, NULL);
iError = SQLExecute(hStmt); // Returns SQL_ERROR if pszBigString len > 8000
表MyTestTable包含一个定义为varchar(max)的列。函数AllocBigString(未显示)创建一个任意长度的字符串。
据我所知,以前版本的SQL Server对varchars有8000个字符的限制,但不是为什么会在SQL 2005中发生这种情况?
谢谢, 安迪
答案 0 :(得分:1)
您确定加载了2005年的SQL Native Driver,而不是2000年的旧驱动程序吗?本机驱动程序名称为{SQL Server Native Client 10.0}(2k8)或{SQL Native Client}(2k5)
错误消息ODBC SQL Server Driver
似乎表明旧的2k驱动程序(我可能错了,现在已经10年没有触及ODBC了)。
答案 1 :(得分:1)
事实证明,虽然该修复程序适用于SQLSetParam,但它不适用于SQLBindParameter。
例如:
int iLength = 18001;
char* pszBigString = new char[iLength + 1];
memset(pszBigString, 'a', iLength);
pszBigString[iLength] = 0;
LONG_PTR lLength = SQL_NTS;
::SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT,
SQL_C_CHAR,
SQL_VARCHAR,
iLength, 0, pszBigString, iLength * sizeof(TCHAR),
&lLength);
无论使用哪种驱动程序,都会导致相同的22001“字符串数据,右截断”错误。
事实上,我的实验表明你不实际上需要安装客户端驱动程序的第10版。相反,如果您希望字符串的长度超过8000个字符,则应使用SQL_LONGVARCHAR而不是SQL_VARCHAR。您可能会执行批量查找和替换,但使用SQL_LONGVARCHAR可能会产生某种惩罚(尽管这是纯粹的推测;它是'扩展数据类型')。
我已经使用Windows XP上的两个驱动程序成功测试了这个: