2009-07-02 127 views
0

摘要:我正在嘗試使用ODBC和SQL Server 2005將文本字符串寫入類型爲varchar(max)的列。如果字符串的長度大於8000.幫助!如何使用ODBC寫入到varchar(max)列

我有一些C++代碼使用ODBC(SQL Native Client)將文本字符串寫入表中。如果我改變,比如說,從VARCHAR(100)爲varchar(最大值)列並嘗試寫,長度大於8000的字符串寫入失敗,出現以下錯誤

[微軟] [ODBC SQL服務器 驅動程序]字符串數據,右截斷

所以,任何人都可以告訴我。如果可以做到這一點,怎麼樣?

一些示例(生產)的代碼,顯示我想要做的事:

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(最大值)單科拉姆。函數AllocBigString(未顯示)創建一個任意長度的字符串。

據我所知,先前版本的SQL Server對varchars有8000個字符限制,但不是爲什麼在SQL 2005中發生這種情況?

感謝, 安迪

回答

1

您務必裝入SQL本機驅動程序在2005年,而不是老司機了2000?本機驅動程序名稱是{SQL Server Native Client 10.0}爲2K8或{SQL Native Client}爲2K5

錯誤消息ODBC SQL Server Driver似乎預示着舊2K驅動程序(我可能是錯的,像10年不碰ODBC現在)。

+0

謝謝你Remus!你是對的,我使用了錯誤的司機。當我改變它的時候,它工作。 爲了記錄,我使用了以下連接字符串: Driver = {SQL Native Client};服務器= 127.0.0.1;數據庫= MyTestDB; 這與您給出的驅動程序名稱並不完全相同,但是您的消化指出了我的答案。 再次感謝 - 非常感謝。 Andy – 2009-07-02 15:23:23

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服務器} 2000.85.1117.00(2004年4月8日)
  • {SQL Server本機客戶端10.0} 2007.100.1600.22( 10/07/2008)