代码之家  ›  专栏  ›  技术社区  ›  Andy Johnson

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

  •  0
  • Andy Johnson  · 技术社区  · 16 年前

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

    我有一些C++代码,使用ODBC(SQL本地客户端)向表中写入文本字符串。如果我将列从(比如)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
    

    我知道以前版本的SQL Server对varchars的限制是8000个字符,但为什么在SQL 2005中会出现这种情况呢?

    谢谢 安迪

    2 回复  |  直到 16 年前
        1
  •  2
  •   Remus Rusanu    16 年前

    确实加载了2005年的SQL本机驱动程序,而不是2000年的旧驱动程序吗?本机驱动程序名称为 {SQL Server Native Client 10.0} 2k8或 {SQL Native Client} 2k5

    错误消息 ODBC SQL Server Driver 似乎表明是旧的2k驱动程序(我可能错了,大概10年没有接触ODBC了)。

        2
  •  1
  •   Balint    16 年前

    结果表明,尽管修复程序适用于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可能会招致某种惩罚(尽管这纯粹是推测;它是一种“扩展数据类型”)。

    • {SQL Server}2000.85.1117.00(04/08/2004)