1

libodbc++JDBCと同様に設計されたC++用のODBCラッパーを使用しています。プリペアドステートメントがあります。"INSERT INTO t1 (col1) VALUES (?)"ここで、t1.col1はとして定義されていVARCHAR(500)ます。

を呼び出すとstatement->setString(1, s)、の値sはに切り捨てられ255ます。libodbc ++ライブラリが疑われますが、ODBCにあまり詳しくないので、ラッパーが基盤となるODBCの制限を公開するだけではないことを確認したいと思います。ODBC APIリファレンスは複雑すぎて、すばやく簡単に説明することはできません。率直に言って、それはしたくないので、基本的な質問をすることをお許しください。

注:insert同じライブラリを介したプリペアドおよびパラメーター化されていないステートメントは、長い値okを挿入するため、MySqlDBの問題ではありません。

4

2 に答える 2

2

長い文字列の場合は、PreparedStatement::setAsciiStream()の代わりに使用しPreparedStatement::setString()ます。

しかし、ストリームを使用すると、「HY104無効な精度値」というエラーが発生することがよくあります。これは、正面から取り組む方法がわからないため、煩わしいものですが、次の手順で回避します。

1、order the columns in SQL statement, non-stream columns go first;

2、if that doesn't work, split the statement to multiple ones, update or query a single column per statement.

しかし(再び)、最初に行を挿入してからストリーム方式でいくつかの列を更新するには、最後の挿入IDを取得する必要がある場合があります。これは、今のところ再び取り組むことができなかった別の課題であることがわかりました。 。

于 2014-03-19T14:58:11.900 に答える
1

わかりませんがlibodbc++、ODBCAPIを介して利用できるPreparedStatementsはより多くの文字を格納できます。Delphi /KylixODBCラッパーで使用します。

たぶん、libodbc++値の長さの制限を設定するためのいくつかの構成がありますか?Delphiライブラリにそのような設定があります。PreparedStatementを使用する場合は、メモリの大きなチャンクを割り当て、それをフィールドに分割し、各列のブロックが開始する場所とSQLBindParameter()関数を介してどのくらいの長さであるかをODBCに表示できます。

于 2011-02-04T07:24:22.260 に答える