C++ コードを使用して、ストアド プロシージャを使用して大きなバイナリ BLOB を MS SQL サーバーに挿入しようとしています。挿入するテーブルには、5 つの列、タイプがあります。
int
varchar
datetime
varbinary(max)
datetime
ストアド プロシージャは、次の 4 つのパラメーターを取ります。
PROCEDURE [dbo].[spr_fff]
@act AS INT
,@id AS VARCHAR(255)
,@timestamp AS DATETIME
,@blob AS VARBINARY(MAX)
ステートメントを設定しました(表示されていない戻り値のチェックを使用):
const std::string queryString("{Call [spr_fff](?,?,?,?)}");
SQLHSTMT handle = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, m_hConn, &handle);
SQLPrepare(handle, (SQLCHAR *)queryString.c_str(), SQL_NTS);
最初の 3 つのパラメーターは問題なくバインドできますが、4 番目のパラメーターをバインドする方法がわかりません。コードは基本的に次のとおりです。
std::string sData; getData(sData); //fills sData with the binary data
SQLLEN len1 = ???;
SQLBindParameter( handle, (SQLUSMALLINT)4, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, len1, 0, (SQLCHAR*)&sData.c_str(), (SQLLEN)sData.size(), NULL);
トリックは、len1がどうあるべきかを考え出すことのようです。の場合sData.size() < 8000
、正常にlen1 = sData.size()
動作します。しかし、 の場合sData.size() > 8000
、何も機能していないようです。を設定した場合len1 = sData.size()
、またはlen1 = 2147483647
を呼び出すとSQLBindParameter
、エラー コード「無効な精度値」が発生します。len1 = 0
(恐ろしい) ドキュメントのいくつかが示唆しているように設定した場合、呼び出しは機能しSQLBindParameter
ます (2008 ネイティブ ドライバーの場合) が、ステートメントを実行すると、サイズ 2 の BLOB が生成されます。つまり、2 つのデフォルト 0 バイトとすべての入力 BLOBデータは 0 バイトに切り捨てられます。以下にリストされているすべてのクライアントドライバーでこれらすべての組み合わせを試しましたが、すべて役に立ちませんでした。私は何を間違っていますか?????
環境
クライアント OS: Windows XP sp3
SQL Server は
Microsoft SQL Server 09.00.3042 です。
試した SQL クライアント:
Microsoft SQL Server Native Client バージョン 10.00.5500 (sqlncli10.dll、2007.100.5500.00)
Microsoft SQL Native Client バージョン 09.00.5000 (sqlncli.dll、2005.90.5000.00)
Microsoft SQL Server ODBC ドライバー バージョン 03.85.1132 (sqlsrv32) .dll 2000.85.1132.0)