我有问题,当我试着插入的一些数据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年:

http://groups.google.com/group/comp.databases.informix/browse_thread/thread/4dab38472e521269?ie=UTF-8&oe=utf-8&q=Informix+jdbc+%22A+blob+data+type+must+be+supplied+within+this%22

我改变了我的码使用的预处理.现在它的工作与JDBC, 但在ODBC当我试图使用预处理我得到了错误:

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)

Script码,以测试这两个驱动程序:

# 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 driver3.50.TC3DE
    • IBM JDBC Driver for Informix IBM Informix动态服务器3.50.JC3DE
有帮助吗?

解决方案

第一关,你真的确定你想使用一个Informix文本的类型?的类型是一个讨厌的使用,部分是因为问题。它预期的任何东西任何SQL标准相对于大型对象(案文仍是不是在SQL-2003年,虽然约等同的结构,CLOB and BLOB,是)。和功能的字节的文本斑点没有改变,因为-噢,比方说,1996年,虽然我怀疑有一种情况下,选择一个较早的日期,如1991年。

特别是,如何从数据都是你计划存放在案文中列?你的例子表示的串的"插入";也就是说,我相信,很多小得多的比你真的会使用。你应该意识到字节或文列使用56字节的描述表中加上一个单独的网页(或设置的网页的)存储的实际数据。因此,对于细小的弦那样,它是一个废弃的空间和带宽(因为数据字节或文本的目的将装运之间的客户和服务的其余部分分开的行)。如果你的尺寸不会得到上述的大约32KB,然后你应该看看使用LVARCHAR而不是文字。如果你将要使用的数据的尺寸上,然后字节或文本或BLOB或CLOB是合理的替代办法,但是你应该看看配置blob空间(字节或文本)或智能blob空间(为BLOB或CLOB).你可以,而且,使用的文本在表,而不是在blob空间;要知道这样做影响你的逻辑登录而使用blob空间,不影响他们喜欢的任何东西一样多。

其中一个特征,我们已经争取一个十年是能够通过字符串中SQL报表作为文本的文字(或字节的文本).这部分是因为经验的人们喜欢你。我还没有成功地得到它的优先前面的其他变化,需要作出。当然,你需要注意的最大尺寸的SQL statement是64KB文本,所以你可能造成太大SQL statement如果你不小心;占位(question marks)在SQL通常阻止那是一个问题,并增加该大SQL声明的另一个特征的请求,我一直在竞选,但有一点低热烈.

好的,假定你有理由对于使用文字...什么样的下一步。我不清楚是什么Java(JDBC驱动)是在幕后做-除了太多的-但这是一个公平的赌注,它注意到这一文本'定位器'的结构是必要的,是运费的参数以正确的格式。它的出现,ODBC driver是不是一边你有类似的把戏。

在ESQL/C,其中我通常工作,然后将代码处理位字节的文本不同于其他的一切(和BLOB and CLOB必须处理不同的方式再)。但你可以创建和填充一个定位器结构(loc_t或ifx_loc_t从定位器。h-这可能不是在ODBC目录;它是在$INFORMIXDIR/含/esql默认情况下),并通过到ESQL/C码作为主变为有关占位在SQL发言。原则上,有可能是一个平行的方法可用于ODBC。你可能已经看Informix ODBC driver手册,以找到它,虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top