JDBC 経由で Informix TEXT 列にデータを挿入しようとすると問題が発生します。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 で、両方のドライバーに対して 1 つのバージョンのコードを使用するための設定はありますか?
バージョン情報:
- サーバー: IBM Informix Dynamic Server バージョン 11.50.TC2DE
- クライアント:
- ODBC ドライバー 3.50.TC3DE
- IBM Informix Dynamic Server 3.50.JC3DE 用の IBM Informix JDBC ドライバ