C++ 如何使用ODBC写入varchar(max)列
小结:我正在尝试使用ODBC和SQLServer2005将文本字符串写入varchar(max)类型的列。如果字符串长度大于8000,则失败。救命啊C++ 如何使用ODBC写入varchar(max)列,c++,sql-server,sql-server-2005,odbc,C++,Sql Server,Sql Server 2005,Odbc,小结:我正在尝试使用ODBC和SQLServer2005将文本字符串写入varchar(max)类型的列。如果字符串长度大于8000,则失败。救命啊 我有一些C++代码,使用ODBC(SQLNest-Client)向表中写入文本字符串。如果我将列从(比如)varchar(100)更改为varchar(max),并尝试写入长度大于8000的字符串,则写入操作将失败,并出现以下错误 [Microsoft][ODBC SQL Server 驱动程序]字符串数据,右截断 那么,有谁能告诉我这是否可以做到
我有一些C++代码,使用ODBC(SQLNest-Client)向表中写入文本字符串。如果我将列从(比如)varchar(100)更改为varchar(max),并尝试写入长度大于8000的字符串,则写入操作将失败,并出现以下错误
[Microsoft][ODBC SQL Server 驱动程序]字符串数据,右截断 那么,有谁能告诉我这是否可以做到,以及如何做到 一些示例代码(非生产代码)显示了我正在尝试执行的操作: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中会出现这种情况呢
谢谢,
Andy您确定加载了2005年的SQL本机驱动程序,而不是2000年的旧驱动程序吗?本机驱动程序名称适用于2k8或2k5
错误消息
ODBC-SQL-Server-Driver
似乎表明是旧的2k驱动程序(我可能错了,大概10年没有接触过ODBC了) 确实加载了2005年的SQL本机驱动程序,而不是2000年的旧驱动程序吗?本机驱动程序名称适用于2k8或2k5
错误消息
ODBC-SQL-Server-Driver
似乎表明是旧的2k驱动程序(我可能错了,大概10年没有接触过ODBC了) 结果表明,尽管修复程序适用于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本机客户端10.0}2007.100.1600.22(10/07/2008)
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本机客户端10.0}2007.100.1600.22(10/07/2008)