一貫した方法に挿入する文字列をInformixデータベースJDBCおよびODBC
質問
い問題がように挿入したデータにInformix文字列 JDBC経由.にODBCできるだけ実行SQLのようになります:
INSERT INTO test_table (text_column) VALUES ('insert')
ここで作業しないでくださいJDBCっエラー:
617: A blob data type must be supplied within this context.
私はこの問題発見からのメッセージ2003年
私は、コードの利用がPreparedStatement.現在でJDBC, がODBC時に使用することができました。PreparedStatementかエラー:
Error: [Informix][Informix ODBC Driver][Informix]
Illegal attempt to convert Text/Byte blob type.
[SQLCode: -608], [SQLState: S1000]
テストテーブルを作成した。
CREATE TABLE _text_test (id serial PRIMARY KEY, txt TEXT)
Jythonのコード試験の両ドライバー:
# for Jython 2.5 invoke with --verify
# beacuse of bug: http://bugs.jython.org/issue1127
import traceback
import sys
from com.ziclix.python.sql import zxJDBC
def test_text(driver, db_url, usr, passwd):
arr = db_url.split(':', 2)
dbname = arr[1]
if dbname == 'odbc':
dbname = db_url
print "\n\n%s\n--------------" % (dbname)
try:
connection = zxJDBC.connect(db_url, usr, passwd, driver)
except:
ex = sys.exc_info()
s = 'Exception: %s: %s\n%s' % (ex[0], ex[1], db_url)
print s
return
Errors = []
try:
cursor = connection.cursor()
cursor.execute("DELETE FROM _text_test")
try:
cursor.execute("INSERT INTO _text_test (txt) VALUES (?)", ['prepared', ])
print "prepared insert ok"
except:
ex = sys.exc_info()
s = 'Exception in prepared insert: %s: %s\n%s\n' % (ex[0], ex[1], traceback.format_exc())
Errors.append(s)
try:
cursor.execute("INSERT INTO _text_test (txt) VALUES ('normal')")
print "insert ok"
except:
ex = sys.exc_info()
s = 'Exception in insert: %s: %s\n%s' % (ex[0], ex[1], traceback.format_exc())
Errors.append(s)
cursor.execute("SELECT id, txt FROM _text_test")
print "\nData:"
for row in cursor.fetchall():
print '[%s]\t[%s]' % (row[0], row[1])
if Errors:
print "\nErrors:"
print "\n".join(Errors)
finally:
cursor.close()
connection.commit()
connection.close()
#test_varchar(driver, db_url, usr, passwd)
test_text("sun.jdbc.odbc.JdbcOdbcDriver", 'jdbc:odbc:test_db', 'usr', 'passwd')
test_text("com.informix.jdbc.IfxDriver", 'jdbc:informix-sqli://169.0.1.225:9088/test_db:informixserver=ol_225;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'usr', 'passwd')
設定はありまJDBCはODBCにショールーム:イメージコード 両ドライバー?
版情報:
- サーバー:IBM Informix動的にサーバーのバージョン11.50.TC2DE
- クライアント:
- ODBCドライバ3.50.TC3DE
- IBM Informix JDBC Driver for IBM Informixダイナミックサーバ3.50.JC3DE
解決
まず最初に、あなたはInformixのTEXTタイプを使用したい、本当によろしいですか?タイプがあるため、あなたが直面している問題の一部に、使用するために迷惑です。ラージオブジェクトに関して、任意のSQL標準では、それは前の日付のもの(TEXTは、まだSQL-2003ではありません - ほぼ同等の構造、CLOBおよびBLOBかかわらず、です)。私は1991年のように、以前の日付を選択する場合があります疑いがあるものの、ああ、のは1996年としましょう。
- そして、BYTEおよびTEXTブロブの機能が以降に変更されていません。具体的には、どのくらいのデータが、あなたは、TEXT列に保管することを計画していますか?あなたの例では、文字列「挿入」を示しています。つまり、私は、あなたが本当に使用するよりもはるかに小さいと推定します。あなたは、BYTEまたはTEXTの列は、実際のデータを格納するテーブルに56バイトの記述子を使用して、プラス別のページ(またはページのセット)ことを認識すべきです。 (BYTEまたはTEXTオブジェクトのデータは、行の残りの部分とは別に、クライアントとサーバーの間で出荷されますので)ので、そのような小さな文字列に対して、それは容量と帯域幅の浪費です。あなたのサイズを約32キロバイトの上に取得することはできません場合は、テキストの代わりにLVARCHARを使用して見なければなりません。あなたはその上にデータサイズを使用する場合は、BYTEまたはTEXTまたはBLOBまたはCLOBは賢明な選択肢ですが、あなたは(BYTEまたはTEXTのための)ブロブスペースや(BLOBまたはCLOBの場合)スマートブロブスペースのいずれかを設定するをご覧ください。することができますし、むしろブロブスペースよりも、テーブル内のテキストを使用して、あります。インパクトそうすることブロブスペースを使用し、一方、あなたの論理ログが同じくらいのように、彼らには何も影響しないことに注意してください。
私が十年のために運動を展開したりしてきた機能の一つは、テキスト・リテラル(またはBYTEリテラル)などのSQL文で文字列リテラルを渡す機能です。それはので、あなたのような人々の経験の一部です。私はまだそれが先に行われる必要があるその他の変更の優先順位を得ることに成功していません。もちろん、あなたは慎重にされていない場合、あなたが大きすぎるSQL文を作成することができるように、SQLステートメントの最大サイズは64キロバイトのテキストは、あることに注意する必要があります。熱心少しとSQL文のサイズを増やすために、私は運動を展開してきた他の機能のリクエストですが、
- SQLのプレースホルダ(疑問符)は、通常、問題であることがことを防ぎます。OK、あなたはTEXTを使用するための妥当な理由を持っていると仮定して...次は何。離れすぎてから - - 私は、Java(JDBCドライバ)が舞台裏で何をしているのか明確ではないんだけど、それはTEXT「ロケータ」構造が必要であることに気付いていると、正しいのパラメータを出荷していることを公正な賭けでありますフォーマット。 ODBCドライバが同様のペテンをごふけるされていないことが表示されます。
私は正常に動作ESQL / Cでは、コードは(再び異なっを扱っする必要があり、BLOBとCLOB)他のすべてとは異なるBYTEおよびTEXTに対処しなければなりません。しかし、あなたが作成および移入ロケータ構造ができます(locator.hからloc_tまたはifx_loc_t - ODBCディレクトリに配置することはできません。それは、デフォルトでは$ INFORMIXDIR /税込/ ESQLである)としてESQL / Cコードにそれを渡しますSQLステートメント内の関連するプレースホルダ変数をホストします。原則的には、おそらくODBCために利用可能な並列方法があります。あなたはしかし、それを見つけるためにのInformix ODBCドライバのマニュアルを見ていることがあります。