Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用ODBC写入varchar(max)列_C++_Sql Server_Sql Server 2005_Odbc - Fatal编程技术网

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

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 驱动程序]字符串数据,右截断 那么,有谁能告诉我这是否可以做到

小结:我正在尝试使用ODBC和SQLServer2005将文本字符串写入varchar(max)类型的列。如果字符串长度大于8000,则失败。救命啊

我有一些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)

结果表明,尽管修复程序适用于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)

谢谢你,雷姆斯!你是对的,我用错了司机。当我改变这一点时,它起了作用。对于记录,我使用了以下连接字符串:Driver={sqlnativeclient};服务器=127.0.0.1;数据库=MyTestDB;这和你给的司机名字不太一样,但你的建议让我找到了答案。再次感谢-非常感谢。而且很明显,我无法超越从MSDN复制粘贴一个名字到答案lol的挑战。对了,名字是{SQL Native Client},为了谷歌的缘故,我也会修改我的帖子。谢谢雷姆斯!你是对的,我用错了司机。当我改变这一点时,它起了作用。对于记录,我使用了以下连接字符串:Driver={sqlnativeclient};服务器=127.0.0.1;数据库=MyTestDB;这和你给的司机名字不太一样,但你的建议让我找到了答案。再次感谢-非常感谢。而且,很明显,我无法超越将一个名字从MSDN复制粘贴到答案lol的挑战。对了,名字是{SQL Native Client},为了谷歌的其他原因,我也会修改我的帖子。