J'ai un problème lorsque j'essaie d'insérer des données dans la colonne Informix TEXT via JDBC. Dans ODBC, je peux simplement exécuter SQL comme ceci:Méthode cohérente d'insertion de la colonne TEXT dans la base de données Informix à l'aide de JDBC et ODBC
INSERT INTO test_table (text_column) VALUES ('insert')
mais cela ne fonctionne pas dans JDBC et je suis arrivé erreur:
617: A blob data type must be supplied within this context.
Je recherchais un tel problème et a trouvé des messages de 2003:
J'ai modifié mon code pour utiliser PreparedStatement. Maintenant, il fonctionne avec JDBC, mais ODBC quand j'essayer d'utiliser PreparedStatement je me suis erreur:
Error: [Informix][Informix ODBC Driver][Informix]
Illegal attempt to convert Text/Byte blob type.
[SQLCode: -608], [SQLState: S1000]
table de test a été créé avec:
CREATE TABLE _text_test (id serial PRIMARY KEY, txt TEXT)
Code Jython pour tester les deux pilotes:
# 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')
Existe-t-il un paramètre dans JDBC ou ODBC pour avoir une version du code pour les deux pilotes?
Version info:
- Serveur: IBM Informix Dynamic Server Version 11.50.TC2DE
- Client:
- pilote ODBC 3.50.TC3DE
- IBM Informix JDBC Driver pour IBM Informix Dynamic Server 3.50.JC3DE
http://stackoverflow.com/questions/1074364/informix-7-3-isql-insert-statement-text-blob-clob-field-insert-error Peut-être que cela éclaircira votre situation comme elle l'a fait le mien – CheeseConQueso