如何使用ODBC写入varchar(max)列

时间:2009-07-02 13:45:50

标签: c++ sql-server sql-server-2005 odbc

总结:我正在尝试使用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中发生这种情况?

谢谢, 安迪

2 个答案:

答案 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上的两个驱动程序成功测试了这个:

  • {SQL Server} 2000.85.1117.00(04/08/2004)
  • {SQL Server Native Client 10.0} 2007.100.1600.22(10/07/2008)