当前位置:首页 » 数据仓库 » informix数据库客户端
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

informix数据库客户端

发布时间: 2023-06-04 04:24:19

‘壹’ 求助,informix客户端连接数据库,报密码错误

1,在ASPX页面上拖两个TextBox,一个用于输入用户名,一个用于输入密码。还有一个Button,给这个Button的Click事件添加判断用户名,密码是否正确的功能,具体见2
2,从页面获取到用户名和密码,在数据库的表中,查找用户名为你输入用户名的记录,如果没有查到,提示“用户名不存在”。如果查找到记录,取出记录对应的用户名和密码信息,比较查寻出来的密码和输入的密码是否一致,不一致,提示“密码错误”。如果密码也正确,你可以显示登录成功,或者是跳转到其他一些有用的页面。

‘贰’ 如何正确设置 Informix GLS 及 CSDK 语言环境

GLS 基本概念
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集(简体中文)、BIG5字符集(繁体中文)、 GB18030字符集(亚洲字符集合)、Unicode( 常用 UTF-8) 字符集等。
Informix GLS 语言环境对常用的字符集进行了命名及内部编码(采用 16 进制编码)管理。通过服务器端的文件:$InformixDIR/gls/cm3/registry 查看 GLS 字符名称、编码对照表。示例如下:
字符集名称 编码 十六进制编码
8859-1 819 # 0x0333
gb 57357 # 0xe00d
GB2312-80 57357 # 0xe00d
utf8 57372 # 0xe01c
big5 57352 # 0xe008
GB18030-2000 5488 # 0x1570

GLS 环境中不同字符集名称可能对应同一个字符集编码,但一个字符集只能有一个编码,也就是说字符集编码才是唯一的。
GLS
环境中按照语言和地区把所支持的字符集分成不同的目录。$InformixDIR/gls/lc11/ 语言 _ 地区
/,如中文大陆地区的目录为:$InformixDIR/gls/lc11/zh_cn/,该目录下有如下两个文件:1570.lco e00d.lco
,说明我们在设置字符集时,我们可以使用 zh_cn.GB18030-2000 zh_cn.gb zh_cn.GB2312-80
三个不同的名称。这里(zh_cn.gb 与 zh_cn.GB2312-80 对应相同的字符集)。
GLS
环境中不同的字符集可以正确的进行转换,查看那些字符集可以正确转换的方法,查看目录 $InformixDIR/gls/cv9
目录下的是否存在指定字符集互相转换的文件。如该目录下有文件 e01ce00d.cvo 和 e00de01c.cvo 两个文件,表示 GLS
通过这两个转换文件支持 UTF-8 与 GB 之间的字符转换。
Informix 通过 DB_LOCALE 和 CLIENT_LOCALE 来设置数据库的语言本地化支持设置。DB_LOCALE 和 CLIENT_LOCALE 的值由四部分组成 ( 第 4 部分为可选 ),字符集不区分大小写。
1 2 3 4
< 语言 >_< 国家和地区 >.< 字符集名 / 字符集编码 >[@modifier]

举例说明 :
CLIENT_LOCALE=en_us.8859-1
CLIENT_LOCALE=en_us.819
# 以上两个为同一字符集:819 为 8859-1 的编码
DB_LOCALE=zh_cn.gb

回页首
GLS 字符集工作原理
Informix 数据库服务器端、客户端字符集的工作原理示意图见图 1。
图 1. IDS GLS 字符集处理过程示意图
DB_LOCALE 环境变量用途
在客户机应用程序和数据库服务器交换字符数据时,如果 DB_LOCALE 环境变量(在客户机计算机上)的值与 CLIENT_LOCALE 的值不同,客户机应用程序将执行代码集转换。 代码集转换防止这两种代码集不同时发生数据破坏。
在客户机应用程序请求连接时,它将包括 DB_LOCALE(如果已设置)的信息发送至数据库服务器。
在确定如何设置服务器处理语言环境的数据库信息时,数据库服务器使用 DB_LOCALE。
在客户机应用程序尝试打开数据库时,数据库服务器将客户机应用程序传递的 DB_LOCALE 环境变量的值与数据库中存储的数据库语言环境进行比较。
当数据库服务器存取与语言环境相关的数据类型的列时,数据库服务器使用 DB_LOCALE 指定的语言环境。
当数据库服务器创建新数据库时,它将检查数据库语言环境(DB_LOCALE),以确定如何在数据库的系统目录中存储字符信息。此信息包括诸如如何处理正则表达式、比较字符串以及确保代码集的正确使用的操作。
CLIENT_LOCALE 环境变量用途
在客户机应用程序和数据库服务器交换字符数据时,如果 CLIENT_LOCALE 环境变量的代码集与 DB_LOCALE(在客户机计算机上)的代码集不同,客户机应用程序将执行代码集转换。代码集转换防止这两种代码集不同时发生数据破坏。
在客户机应用程序请求连接时,它将包括 CLIENT_LOCALE 的信息发送至数据库服务器。
在确定如何设置服务器处理语言环境的客户机应用程序信息时,数据库服务器将使用 CLIENT_LOCALE。
在 Informix Esql/C 的预处理器处理源文件时,它接受以 CLIENT_LOCALE 的代码集编写的 C 源代码。 在
Informix ESQL/C 客户机应用程序执行时,将检查 CLIENT_LOCALE
以获得客户机语言环境的名称,该语言环境将对操作系统文件名、文本文件的内容以及日期、时间和数字数据的格式产生影响。
在数据库实用程序创建文件时,文件名和文件内容位于 CLIENT_LOCALE 指定的代码集中。在查找特定于产品的消息文件时,客户机应用程序将检查与客户机语言环境关联的消息目录。
四个语言环境的含义
客户机语言环境— Client locale
客户机语言环境指定客户机应用程序用于执行读和写(I/O)操作的语言、地域和代码集。在客户机应用程序中,I/O
操作包括读取键盘输入或要发送至数据库的数据文件,以及将数据库服务器从数据库中检索的数据写入屏幕、文件或打印机。 通过 CLIENT_LOCALE
来设置客户机语言环境。
数据库语言环境— Database locale
通过 DB_LOCALE 环境变量设置的数据库语言环境指定数据库服务器用于正确解释特定数据库中语言环境相关的数据类型(NCHAR 和
NVARCHAR)所需的语言、地域和代码集。DB_LOCALE
中指定的代码集确定哪些字符在任何字符列中都是有效的,并且确定数据库对象(如数据库、表、列和视图)的名称。数据库服务器使用 DB_LOCALE
环境变量指定的数据库代码集将数据传入和传出数据库。
服务器语言环境— Server locale
数据库服务器使用 SERVER_LOCALE 环境变量指定的服务器代码集写文件(如调试和警告文件)。但是,数据库服务器不使用服务器语言环境来写入采用 Informix 专用格式的文件(数据库和表文件)。
服务器处理语言环境— Server processing locale
数据库服务器使用数据库语言环境的代码集作为服务器处理语言环境的代码集 , 使用服务器处理语言环境来写入采用 Informix
专用格式的文件(数据库和表文件)。也就是说数据库服务器使用数据库语言环境(DB_LOCALE)来写入采用 Informix
专用格式的文件(数据库和表文件)。
建立数据库连接过程
在客户机应用程序请求与数据库的连接时,数据库服务器使用 GLS 语言环境执行以下步骤。
客户机应用程序发送语言环境信息到数据库服务器。

CLIENT_LOCALE( 未设置将采用默认 en_us.819);
DB_LOCALE( 未设置则不发送 )。
验证是否能够在客户机应用程序及其请求的数据库之间建立连接。
对比如下两个语言环境:
匹配,则建立连接。
不匹配,提示无法连接到数据库。或者可以继续进行这样的连接,但是数据库服务器可能会不正确地解释它从客户机接收到的数据,那么只能靠自己来理解交换中数据的格式。
由客户机应用程序发送的 DB_LOCALE 指定的语言环境;
存储在请求数据库的系统目录中的数据库语言环境。
确定服务器处理语言环境,按如下顺序确定服务器处理语言环境:

使用客户机定义的 DB_LOCALE;
数据库语言环境中的环境变量 DB_LOCALE。
执行代码集转换
在客户机 / 服务器环境中,如果客户机或服务器计算机使用不同的代码集来表示相同的字符,那么需要将字符数据从一种代码集转换为另一种代码集。如果不进行代码集转换,那么一台计算机无法正确地处理或显示源自另一台计算机的字符数据(在这两台计算机使用不同的代码集时)。
何时执行代码集转换
只有在两个代码集(客户机和服务器处理语言环境,或服务器处理语言环境和服务器)不同时,应用程序才必须使用代码集转换。以下情况是代码集不同的可能原因:
不同的操作系统可能以不同的方式对同一字符进行编码。
如果客户机语言环境和数据库语言环境指定不同的代码集,客户机应用程序将执行代码集转换以便服务器计算机不会装入此类型的处理。
如果服务器语言环境和服务器处理语言环境指定不同的代码集,数据库服务器将在写入和读取操作系统文件(如日志文件)时执行代码集转换。该转化不涉及到数据库数据的问题。
在图 1 中,黑点表示在客户机 / 服务器环境中可能发生代码集转换的两个时刻。
客户机应用程序代码集转换
当以下两个条件都为真时,客户机应用程序自动在客户机和数据库代码集之间执行代码集转换:
客户机和数据库语言环境的代码集不匹配。
客户机和数据库代码集之间的转换存在有效的目标代码集转换。
客户机应用程序开始执行时,它会比较客户机和数据库语言环境的名
称,以确定是否执行代码集转换。如果设置了 CLIENT_LOCALE 和 DB_LOCALE
环境变量,那么客户机应用程序使用这些语言环境名称来分别确定客户机和数据库的代码集。如果未设置 CLIENT_LOCALE(且未设置
DBNLS),那么客户机应用程序假定客户机语言环境为缺省语言环境。如果未设置 DB_LOCALE(且未设置
DBNLS),那么客户机应用程序假定数据库语言环境与客户机语言环境(CLIENT_LOCALE 设置的值)相同。
如果客户机和数据库代码集相同,那么无需进行代码集转换。但是,如果代码集不匹配,客户机应用程序必须确定这两个代码集是否可转换。如果客户机可以找到关联的代码集转换文件,那么两个代码集是可转换的。这些代码集转换文件必须存在于客户机计算机上。
举例说明:
客户机应用程序:CLIENT_LOCALE=en_us.1252 DB_LOCALE=en_us.8859-1
客户机应用程序确定它必须在 Windows 代码页 1252(客户机语言环境中)和
ISO8859-1 代码集(数据库语言环境中)之间执行代码集转换。
若链接具有 GB(zh_cn.gb) 语言环境的数据库,那么数据库将设置 SQLWARN 警告,原因是语言、地区和代码
集不同。客户机应用程序将不正确地执行代码集转换。
它将继续在 Windows 代码页 1252 和 ISO8859-1 之间,而不是在 Windows 代码页 1252 和 zh_cn.gb 之间进行
转换。这种情况可能会导致数据破坏。应用程序将不会继续此链接。

回页首
设置字符集
Informix 通过 DB_LOCALE 和 CLIENT_LOCALE 来设置数据库的语言本地化支持设置。
数据库服务端
在创建数据库时(为了统一系统数据库与应用数据库的字符集,在创建数据库实例时),请按如下步骤设置数据库的 DB_LOCALE 值。
1. 设置环境变量 DB_LOCALE
set DB_LOCALE=zh_cn.gb
2. 创建数据库 create database dbname
3. 验证当前数据库字符集
SELECT dbs_collate FROM sysmaster:sysdbslocale
WHERE dbs_dbsname = ‘ dbname ’

客户端
当我们使用 ODBC,JDBC 连接数据库时,我们需要在连接信息中正确设置语言环境变量:DB_LOCALE 和 CLIENT_LOCALE。
设置语言环境变量
DB_LOCALE=zh_cn.gb
CLIENT_LOCALE=zh_cn.gb

ODBC:
下图为 WINDOWS 环境下 ODBC 语言环境设置示意图。
图 2. 在 ODBC 中设置语言环境
UNIX 环境下需要在 odbc.ini 文件中定义:
在 odbc.ini 文件中定义如下两项数据库语言环境变量
DB_LOCALE=zh_cn.gb
CLIENT_LOCALE=zh_cn.gb

JDBC:
在使用 JDBC 连接数据库时,我们需要在连接数据库的 URL 中设置数据库语言环境变量:DB_LOCALE 和 CLIENT_LOCALE。示例如下:
String url = "jdbc:Informix-sqli://10.127.1.11:8001/testdb:
InformixSERVER=servername;user=user;password=password;
DB_LOCALE=zh_CN.gb;CLIENT_LOCALE=zh_CN.gb";

回页首
常见字符集设置问题
在 Informix 数据库字符集设置与使用过程,我们常会遇到一些字符集相关错误,知道了错误产生的原因,就可以很容易解决问题。这里我们总结了几种常见的字符集设置相关问题。
Error -23101 Unable to load locale categories
当设置的 DB_LOCALE 和 CLIENT_LOCALE 的字符集对应的以下文件不存在时,出现该错误。
- $InformixDIR/gls/lc11/DB_LOCALE's( 语言 _ 地区 )/(db 的 16 进制编码 ).lco
- $InformixDIR/gls/lc11/CLIENT_LOCALE's( 语言 _ 地区 )/( db 的 16 进制编码 ).lco
- $InformixDIR/gls/lc11/CLIENT_LOCALE's( 语言 _ 地区 )/( client 的 16 进制编码 ).lco
举例说明:
DB_LOCALE = en_us.utf8 #(对应的 16 进制编码为:e01c)
CLIENT_LOCALE = zh_cn.gb18030-2000 #(对应的 16 进制编码为:1570)
以下 3 个文件必须存在,缺任意文件将报 Error -23101。
- $InformixDIR/gls/lc11/en_us/e01c.lco
- $InformixDIR/gls/lc11/zh_cn/e01c.lco
- $InformixDIR/gls/lc11/zh_cn/1570.lco

Error -23104 Error opening required code-set conversion object file
当设置的 DB_LOCALE 和 CLIENT_LOCALE 的字符集对应的以下转换文件不存在时,会出现该错误。当然只有当 DB_LOCALE 和 CLIENT_LOCALE 的字符集不一致时才会需要转换,如果一致则不会出现 -23104 错误。
- $InformixDIR/gls/cv9/ccccdddd.cvo
- $InformixDIR/gls/cv9/ddddcccc.cvo

其中:cccc 为 CLIENT_LOCALE 字符集编码对应的 16 进制值
dddd 为 DB_LOCALE 字符集编码对应的 16 进制值
举例说明
DB_LOCALE = en_us.utf8 #(对应的 16 进制编码为:e01c)
CLIENT_LOCALE = zh_cn.gb18030-2000 #(对应的 16 进制编码为:1570)
以下 2 个文件必须存在,缺任意文件将报 Error -23104。
- $INFOMRIXDIR/gls/cv9/e01c1570.cvo
- $INFOMRIXDIR/gls/cv9/1570e01c.cvo

Error -23197 Database locale information mismatch
当出现如下情况时,出现 -23197 错误。
定义的 DB_LOCALE 值与数据库的使用的值(数据库创建时使用的 DB_LOCALE 值)不一致;
通过 SET COLLATION 语句定义 DB_LOCALE 值与数据库的使用值不一致 ;
举例说明:
数据库的 LOCALE= en_us.8859-1
可以通过如下 SQL 读取当前数据库的 LOCALE 值
SELECT dbs_collate FROM sysmaster:sysdbslocale WHERE dbs_dbsname = ‘ dbname ’
客户端 DB_LOCALE 设置如下(注意:如果没有设置 DB_LOCALE,将使用在服务器计算机上设置
的 DB_LOCALE),则会出现 -23197 错误
DB_LOCALE = zh_cn.gb

Error -201,-202 数据库提示语法错误
Error -201,-202 数据库提示语法错误,不支持中文对象名,如中文表名、字段别名、视图名。该类错误提示原因是当前数据库的 DB_LOCALE 设置问题。
如果数据库的 DB_LOCALE 设置为 zh_cn.GB18030-2000,则数据库就可以支持中文对象名。
举例说明:
DB_LOCALE = zh_cn.GB18030-2000 的数据库,可以支持如下中文对象名,否则将提示语法错误。
Select c1 第一列 from test_cn;
Create table 中文表名 (c1 integer, 中文列名 integer);
drop table 中文表名 ;
若类似 SQL 不能运行,请核查数据库的 DB_LOCALE 值。
SELECT dbs_collate FROM sysmaster:sysdbslocale WHERE dbs_dbsname = ‘ dbname ’

乱码问题
Informix
字符出现乱码问题,或者不能正确显示中文字符。问题的原因是客户端 CLIENT_LOCALE 设置的值与 DB_LOCALE
值不一致,而且两者对应的字符集之间不能正确进行转换。需要重新设置 CLIENT_LOCALE 与 DB_LOCALE
的值,确保两者一致或者可以正确相互转换。
时间格式问题
Informix 数据库的时间格式由数据库服务器端环境变量 GL_DATE GL_DATETIME 控制,默认的字符集下默认的时间格式为:
GL_DATE="%m/%d/%iy"
DATETIME="%iY-%m-%d %H:%M:%S"

但是,当我们设置了 DB_LOCALE 为
zh_cn.gb 的情形下,而没有设置 GL_DATE,DATETIME,则时间格式会采用 CLIENT_LOCALE 的值,在
zh_cn.gb 情况下,会出现:“2009 年 10 月 2
日”的日期格式,如果我们之前系统采用默认的时间格式的情况下,就会出现时间格式不匹配的错误。如果我们仍然需要采用默认的时间格式,我们需要在数据库服
务端修改时间格式环境变量即可:
GL_DATE="%m/%d/%iy"
DATETIME="%iY-%m-%d %H:%M:%S"

回页首
GLS 对 CSDK 版本要求
CSDK2.8 及以上版本中(目前最新版本为 CSDK3.5),为了正确支持语言文字的处理,Informix GLS 语言环境下要求正确设置数据库服务器语言环境及客户端语言环境。在中文语言环境下,我们应该按如下要求设置服务器端和客户端语言环境。
数据库服务端:
在创建数据库时(为了统一系统数据库与应用数据库的字符集,在创建数据库实例时),请按如下步骤设置数据库的 DB_LOCALE 值。
1. 设置环境变量 DB_LOCALE
set DB_LOCALE=zh_cn.GB18030-2000
2. 创建数据库 create database dbname
3. 验证当前数据库字符集
SELECT dbs_collate FROM sysmaster:sysdbslocale
WHERE dbs_dbsname = ‘ dbname ’

客户端:
当我们使用 ODBC,JDBC 连接数据库时,我们需要在连接信息中正确设置语言环境变量:DB_LOCALE 和 CLIENT_LOCALE。
设置语言环境变量
DB_LOCALE=zh_cn.GB18030-2000
CLIENT_LOCALE=zh_cn.GB18030-2000

CSDK2.7 版本,IDS 默认情况下使用
Garbage In, Garbage Out 模式处理中文字符,若数据库服务器上的 DB_LOCALE 采用默认的 en_us.8859-1
字符集,能够正常支持中文字符。但是升级到 CSDK2.8 及以上版本时,不再支持 Garbage In, Garbage Out
模式,将出现乱码问题。该情况下,建议更改数据库的字符集(设置
DB_LOCALE=zh_cn.GB18030-2000,重新创建数据库),然后按本文中描述的方法进行 DB_LOCALE 与
CLIENT_LOCALE 的设置方法进行处理。若在实际环境下重建数据库成本太高,可以考虑如下步骤进行解决 ODBC 支持中文的问题。
数据库服务器端:
1. 设置环境变量: IFMX_UNDOC_B168163=1
2. 将 en_us.8859-1 字符集文件拷贝到 zh_cn 目录下
cd $INFORMIXDIR/gls/lc11
cp ./en_us/0333.lco ./zh_cn
3. 重新启动 IDS
客户端:
设置语言环境:
l DB_LOCALE=zh_cn.GB18030-2000
l CLIENT_LOCALE=zh_cn.GB18030-2000

对于 JDBC 我们可以通过 NEWCODESET 来解决该问题:
URLString = "jdbc:Informix-sqli://9.125.66.130:6346/dbname:InformixSERVER=servername;
NEWCODESET=GB18030-2000,8859-1,819;
CLIENT_LOCALE=en_US.8859-1;DB_LOCALE=en_US.8859-1;"

‘叁’ .net vs怎么连接Informix数据库

在使用 ADO.NET 驱动程序之前,应该确保该驱动程序已安装并能正确运行。该驱动程序的当前版本可以使用 Informix Client Software Developer's Kit (SDK) 2.90 来安装。与以前的 2.81 版本不同,此 SDK 版本包括默认的 ADO.NET 驱动程序。SDK 的安装程序也会警告您有关事项。它并不真正在您的计算机上查找 .NET 框架的安装,只是警告您必须在安装 SDK 之前安装好 .NET 框架。如果您已经安装了 2.81 SDK,那么最好先卸载它。这两个版本无法共存。还要认识到的一点是,在将 2.90 ADO.NET 驱动程序添加到 Visual Studio Projects 中时,它会不正确地报告它自己是版本 2.81。

2.9 版本是在 2.81 版本之上的一次重要升级。它包括一个新的 IfxDataAdapter 向导、IPv6 支持和一些用于 Informix 数据类型(IfxDateTime、IfxDecimal、IfxBlob 和 IfxClob)的新类。该文档更为完善,内容总量是以前的两倍。

要点:IBM Informix ADO.NET 驱动程序并不仅仅包含在安装目录下的 /bin 目录下的 IBM.Data.Informix.dll 文件中。显然,它使用了由 SDK 安装的其他客户端代码。这意味着您必须在所有将使用 ADO.NET 驱动程序的机器上安装 Informix Client SDK。您不能只在您的发行版中包括 IBM.Data.Informix.dll。这对一些应用程序而言可能是一个严重的限制。您还需要仔细检查 SDK 安装程序 (SetNet32),以定义 Informix 数据源。

在将 ADO.NET 驱动程序用于连接之前,还必须运行一个叫做 cdotnet.sql 的存储过程。这个存储过程位于 SDK 安装的 /etc 目录中。这类似于设置 OLEDB 驱动程序的过程,尽管这个过程更短一些。这个过程记录在 User's Guide 中。(请参阅下面的参考资料部分。)

在完成安装之后,检查一下驱动程序,确保建立了连接。要在 Visual Studio 项目中使用 ADO.NET 驱动程序,则必须确保已将一个引用添加到客户端 SDK 安装的 /bin 目录中找到的 IBM.Data.Informix.dll 中。正确的using语句是:using IBM.Data.Informix。以下是一个演示如何获得到数据库的连接的简单方法:

清单1.到Informix数据库的连接
publicvoidMakeConnection(){stringConnectionString="Host="+HOST+";"+"Service="+SERVICENUM+";"+"Server="+SERVER+";"+"Database="+DATABASE+";"+"Userid="+USER+";"+"Password="+PASSWORD+";";//,DB_LOCALEetc//FulllistinClientSDK's.NetProviderReferenceGuidep3:13IfxConnectionconn=newIfxConnection();conn.ConnectionString=ConnectionString;try{conn.Open();Console.WriteLine("Madeconnection!");Console.ReadLine();}catch(IfxExceptionex){Console.WriteLine("Problemwithconnectionattempt:"+ex.Message);}}

示例代码中包括一个用于此功能的BasicConnection类。如您所见,ConnectionString只是一个用于连接的分号分隔的参数列表。Open()方法打开了到数据库的连接,如果连接失败,则抛出一个IfxException。IfxException.Message属性通常提供关于失败原因的合理数量的详细信息

基本命令

一旦建立了连接,就可以开始对数据库执行命令。要做到这一点,需要使用IfxCommand对象。IfxCommand的构造函数接收一个字符串(SQL 命令文本)和一个IfxConnection作为参数。IfxCommand对象有一系列的Execute方法,以便对数据库执行命令。要清除连接,可以使用IfxConnection.Close()方法。以下是执行某个不返回结果集的简单命令的例子。该命令可能是 insert、update 或 delete。

清单2.执行insert、update或delete命令
IfxCommandcmd;cmd=newIfxCommand("insertintotestvalues(1,2,'ABC')",conn);cmd.CommandTimeout=200;//{introws=cmd.ExecuteNonQuery();}catch(IfxExceptionex){Console.WriteLine("Error"+ex.Message);}

ExecuteNonQuery以整数形式返回受命令影响的行数。您还可以构建参数化语句和查询,后面部分将对它们进行研究。注意IfxCommand的CommandTimeout属性。默认超时时间是 30 秒,尽管在文档中没有对此进行说明。除非更改此属性,否则运行 30 秒后,命令就会超时,并且将抛出一个异常。

下一个例子是执行一条 select 语句,并处理由数据库服务器返回的结果集。对于快速的、只向前通过结果的游标,可以使用由ExecuteReader方法返回的IfxDataReader。不过,每个IfxConnection只可以有一个打开的IfxDataReader。(这是一条 ADO.NET 限制,不是 Informix ADO.NET 驱动程序的特定限制。)

清单3.迭代通过IfxDataReader
IfxCommandcmd=newIfxCommand("select*fromtest",bconn.conn);try{IfxDataReaderdr=cmd.ExecuteReader();while(dr.Read()){inta=dr.GetInt32(0);intb=Convert.ToInt32(dr["b"]);stringc=(String)dr[2];}dr.Close();}catch(IfxExceptionex){Console.WriteLine("Error"+ex.Message);}

每一列都被作为一般的 Object 类型进行检索。正如代码所演示的,存在一些将列 Objects 转换为正确数据类型的方法。您可以使用IfxDataReader的GetXxx方法。对于每种数据类型,几乎都有相应的方法。GetXxx方法将列数目作为一个参数。可以使用IfxDataReader的索引,通过列的名称来访问列。如果可能的话,.NET 框架的Convert函数可以将这些 Objects 转换为正确的类型。最后,可以根据列编号为这些列建立索引,并直接强制转换结果(对于某些类型)。

下一个例子将展示如何调用需要一个参数值的存储过程。

清单4.执行带有一个参数的存储过程
IfxCommandcmd=newIfxCommand("test_proc",conn);cmd.CommandType=CommandType.StoredProcere;//fromSystem.Datacmd.Parameters.Add("in_parameter",2);//manywaystocreatethesetry{cmd.ExecuteScalar();}catch(IfxExceptionifxe){Console.WriteLine("Error"+ifxe.Message);}

对于此IfxCommand,必须将CommandType设置为来自System.Data中的CommandType枚举的StoredProcere值。为了创建参数,可以使用IfxCommand的Parameters.Add方法。IfxCommands.Parameters是一个集合,因此您可以添加您所需数量的参数。您可以使用任意IfxParameter()构造函数来创建参数,或者可以像上面这样简化参数的创建。不过要注意的是,每个IfxParameter都与一个特定的IfxCommand相关。您不能先创建IfxParameters,然后在多个IfxCommand对象中使用它们。ExecuteScalar()方法现在只返回 1。这一示例没有从存储过程返回任何东西。

要构建一个不执行存储过程的参数化 SQL 语句,需要将问号作为占位符插入CommandText中。例如:

清单5.参数化查询
IfxCommandinsCmd=newIfxCommand("insertintoclientstest"+"(clientcode,clientacctname,primarycontact,primaddrcode,"+"initialamt,createdate)values(0,?,?,?,?,TODAY)",conn);

按照IfxParameter对象在命令文本中的顺序,将这些对象添加到IfxCommand的Parameters集合中。在下面的扩展示例中的最终强类型化DataSets中,将进一步演示此技术。

强类型数据集

ADO.NET 包括一个叫做DataSet的专用数据库对象。它是一个内存数据库。DataSet由一个或多个(由一些DataRow对象的)DataTable对象组成。DataTable可以通过主键和外键相关联。可以对数据设置一些约束。DataSet也与实际的数据存储断开连接,可以通过一个或多个DataAdapter(每个DataTable一个)来填充它,然后在内存中保存这些数据和所有更改。稍后,DataAdapter可以将这些更改提交回数据存储。

基本的DataSet不是强类型的。它不知道数据库的实际行和列是什么。因此编译器没有检查这些列名称。直到运行的时候,列名称中的任何错误才会显现出来。此外,当开发者记不清列名是 "itemcode" 还是 "itemid" 的时候,他会发现基本的 DataSet 在这方面毫无帮助。

一个强类型的DataSet可以解决这些问题。而一个普通的DataRow却无法取代它,因为普通的DataRow只有一个(例如)作为OrderDetailDataTable一部分的OrderDetailDataRow。您可以将这些列作为OrderDetailDataRow的实际属性 (row.ItemCode) 进行引用。用这种方式,可以提高 IntelliSense 的生产率。表名称和列名称在属性编辑器中也会变得有效,从而增强诸如数据绑定之类的设计人员级工具。

那么,怎样构建这个提高生产率的强类型DataSet呢?要花费如此多的时间或精力来构建一个您还没有体验到任何净生产效率的东西吗?Informix ADO.NET 驱动程序可能没有其他一些驱动程序那么复杂。Microsoft 的SQLDataAdapter(用于 SQL Server)包括一个 Generate DataSet 向导。而IfxDataAdapter没有这样的向导。不过,您可以构建一些工具来帮助您,也可以使用一些已在 .NET 框架中构建的工具。最后,您将拥有封装所有数据库交互的强类型DataSet的一个子代。

.NET 框架包括一个 XSD 编译器 (xsd.exe),它可以从某个经过特殊格式化的 .xsd 文件中生成一个强类型DataSet。但是,谁想键入一串 XML 呢?幸运的是,DataSet对象包括一个叫做WriteXmlSchema()的方法。此方法允许您使用非类型化的DataSet为强类型DataSet创建 XSD 文件。让我们来看一下如何做到这一点。以下是一个示例表:

清单6.Clientstest表
CREATETABLEclientstest(clientcodeSERIALnotnull,clientacctnameCHAR(60)notnull,primarycontactCHAR(30)notnull,primaddrcodeCHAR(10),createdateDATE,initialamtDECIMAL(18,0));
以下是用于此表的单表DataSet:
清单7.定义DataSet
DS=newDataSet("dsClients");//=newDataTable("clients");DataColumnCollectioncols=mainTable.Columns;DataColumncolumn=cols.Add("clientcode",typeof(Int32));column.AllowDBNull=false;cols.Add("clientacctname",typeof(String)).MaxLength=60;cols.Add("primarycontact",typeof(String)).MaxLength=30;cols.Add("primaddrcode",typeof(String)).MaxLength=10;cols.Add("initialamt",typeof(Decimal));cols.Add("createdate",typeof(System.DateTime));//primarykeymainTable.PrimaryKey=newDataColumn[]{cols["clientcode"]};//addtabletoDataSetDS.Tables.Add(mainTable);//WriteschematofileDS.WriteXmlSchema("dsClients.xsd");

在这个定义中,可以在数据上设置类型和限制条件。还可以设置列名称。这些名称不必与数据库的列名称匹配。观察本文下载部分中的代码文件,以查看得到的 dsClients.xsd 文件。

为了使生成 XSD 文件(或者在发生更改后重新生成它)变得更容易,可以为这些DataSetBuilders 构建一个框架。(完成此任务所需的所有代码都包含在下面部分。)在想用该框架确定要构建哪些 Builders 时,可以使用反射来动态确定某一 Builders 是否是DataSetBuilder。让我们从编写IBuildable接口开始。它定义了DataSetBuilder必须实现的属性和方法。

清单8.IBuildable接口
publicinterfaceIBuildable{stringFileName{get;set;}stringFilePath{get;set;}LoggerLog{get;set;}DataSetDS{get;set;}voidBuildXSD();voidCompileXSD(stringoutputDirectory);}

‘肆’ 如何将informix数据库的dat数据表导入到sql server或access中。我没有安装informix.

先要安装一个informix客户端,然后到控制面板-管理工具-odbc管理器里建一个数据源,安装客户端后,建数据源时才能有informix的选项,要用户名密码及服务名等一些东西,测试连接通过建好后,到sqlserver的dts导入到处工具里,在源数据库里选择odbc驱动程序,然后在下面的数据源选项的下拉列表里就会有你刚建的数据源,然后下一步,开始进入sqlserver选择导到哪里,接下来的东西就是很简单的了.