2009-07-02 32 views
0

要約:ODBCおよびSQL Server 2005を使用してvarchar(max)型の列にテキスト文字列を書き込もうとしています。文字列の長さ8000より大きい。ヘルプ!ODBCを使用してvarchar(max)列に書き込む方法

ODBC(SQL Native Client)を使用してテキスト文字列をテーブルに書き込むC++コードがあります。私はvarchar型(最大)までのvarchar(100)、たとえば、から列を変更し、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型(最大)として定義され、単一のcolumが含まれています。関数AllocBigString(図示せず)は、任意の長さの文字列を作成する。

SQL Serverの以前のバージョンではvarcharsに8000文字の制限がありましたが、SQL 2005ではこれがなぜ起こっているのではないと思いますか?

おかげで、 アンディあなたはあなたが2005年のSQLネイティブドライバをロード

答えて

1

、いない2000年の古いドライバ?ネイティブドライバ名は2K5

ため2K8または{SQL Native Client}ため、エラーメッセージODBC SQL Server Driver{SQL Server Native Client 10.0}ある古い2Kドライバを(私が間違っている可能性があり、今10のような年でODBCには触れていない)を示しているように見えます。

+0

ありがとうございます!あなたは正しい、私は間違ったドライバを使用していた。私がそれを変更したとき、それは働いた。 レコードとしては、次の接続文字列を使用しました。 ドライバ= {SQLネイティブクライアント};サーバー= 127.0.0.1;データベース= MyTestDB; あなたが与えたドライバ名とまったく同じではありませんが、あなたの甘えが答えに私を指摘しました。 ありがとうございます。大変感謝しています。 Andy –

+0

明らかに、私はMSDNから名前をコピーして回答を得ることができません。そうですね、名前は{SQL Native Client}ですが、他のGoogleのためにも投稿を修正します。 –

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_VARCHARではなくSQL_LONGVARCHARを使用してください。大量の検索と置換を実行する可能性がありますが、SQL_LONGVARCHARを使用すると何らかのペナルティが発生する可能性があります(純粋な推測ですが、拡張データ型です)。

私は、Windows XP上の両方のドライバで正常にこれをテストしています

  • {SQL Serverの} 2000.85.1117.00(2004年4月8日)
  • {SQL Serverネイティブクライアント10.0} 2007.100.1600.22( 10/07/2008)
関連する問題