2011-02-03 12 views
1

私はlibodbc++ ODBCラッパーをC++に使用しています。これはJDBCと同様に設計されています。私は準備文"INSERT INTO t1 (col1) VALUES (?)"を持っています。ここでt1.col1VARCHAR(500)と定義されています。は255バイトより長い文字列をODBC準備文のパラメータ値として使用できますか?

statement->setString(1, s)を呼び出すと、sの値は255に切り捨てられます。私はlibodbC++ライブラリを疑っていますが、ODBCについてよく知らないので、ラッパーが基になるODBCの制限を公開していないことを確認したいと思います。 ODBC APIのリファレンスは、すばやくスキミングするのが難しく、率直に言って私はそれをしたくないので、基本的な質問をするために私を許してください。

注:同じライブラリを使用して準備されていないパラメータ化されていないパラメータinsertは長い値を挿入するため、MySql DBの問題はありません。

答えて

1

私はlibodbc++がわかりませんが、ODBC APIで使用可能なPreparedStatementにはさらに多くの文字を格納できます。 Delphi/Kylix ODBCラッパーで使用します。

libodbc++に値の長さ制限を設定する設定がありますか?私はDelphiのライブラリにそのような設定をしています。 PreparedStatementを使用する場合は、メモリの大きな塊を割り当ててフィールドに分割し、各列のブロックが開始され、どのくらい時間がかかりますかODBCを表示します。SQLBindParameter()機能を使用します。

+0

問題は、libodbC++のドキュメントがかなり単純で、古くなっていることです。私のための正しいソリューションは、mysqlコネクタ/ C++に移行することだと思います。これは非常によく似たインターフェースを持っています。 – davka

+0

'SQLBindParameter'を' libodbC++ 'ソースで見つけ、それがどのパラメータを使用しているかを見ることができます。おそらくそこにはいくつかの制限があります。それからそれを可変にする方法を探します(255はデフォルト値かもしれません)。 –

2

長い文字列の場合、PreparedStatement::setString()の代わりにPreparedStatement::setAsciiStream()を使用してください。

しかし、使用ストリームは、私は多くの場合、私はそれが頭の上どのように取り組むには考えているので、迷惑ですエラー「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を取得する必要があり、私はもう一度頭を上げることに失敗しました...

戸田、Michal。
関連する問題