在C#中使用IBM Informix ODBC Driver查询问题

时间:2017-07-27 06:51:28

标签: c# informix

我在网上多次搜索我的问题后问我的问题。

就我的工作而言,我需要使用IBM Informix ODBC Driver(v 3.70)在Informix数据库上使用C#进行查询。 当我想提取字符Ø(直径)时,引擎的数据库返回以下消息“ERROR [HY000]代码集转换输入中的无效字节”。

我认为DB_LOCALE或CLIENT_LOCALE不匹配但我不确定。

区域设置: - DB_LOCALE:en_US.1252 - LIENT_LOCALE:en_US.1252

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

仔细检查数据库是否为1252,以及表中的内容。 也许数据库中该特定字符的代码在CP1252中并不真正有效 在1252年,O-slash对应于:

Ø 0xd8 Latin Capital Letter O With Stroke
ø 0xf8 Latin Small Letter O with Stroke

使用1252数据库进行快速测试:

D:\infx\ids12>set DB_LOCALE=en_US.1252
D:\infx\ids12>set CLIENT_LOCALE=en_US.1252
D:\infx\ids12>dbaccess enus1252 -
Database selected.
> drop table t1;
Table dropped.
> create table t1(c1 char(10));
Table created.
> load from o.txt insert into t1;
1 row(s) loaded.
>
Database closed.

D:\infx\ids12>od -x o.txt
0000000000      F8D8
0000000002

使用oncheck查看页面中的内容

D:\infx\ids12>oncheck -pp enus1252:t1 256
addr             stamp    chksum nslots flag type         frptr frcnt next     p
rev
1:16444          725726638 ded2   1      1    DATA         34    4054  0
0
        slot ptr   len   flg
        1    24    10    0
slot   1:
    0: d8 f8 20 20 20 20 20 20 20 20                     Xx        ......

D:\infx\ids12>

现在来自C#

-----
D:\Infx\work\cs>cat s.cs
using System;
using System.IO;
using System.Data;
using System.Text;
using IBM.Data.Informix;
using System.Windows.Forms;

class sample {
    static void Main(string[] args) {

try
{
     using (IfxConnection conn = new IfxConnection("Server=ids1210;Database=enus1252;uid=informix;pwd=ximrofni;DB_LOCALE=en_US.1252"))
     {
          conn.Open();
          using (IfxCommand cmd = conn.CreateCommand())
          {
              cmd.CommandText = "select * from t1";
              IfxDataReader rd = cmd.ExecuteReader();
              rd.Read();
              do
              {
                   if (rd.HasRows)
                        Console.WriteLine("c1= {0}", rd[0]);
              } while (rd.Read());
          }
      }
  }
  catch (IfxException exc)
  {
       Console.WriteLine("Update: {0}", exc.Message);
       foreach (IfxError error in exc.Errors)
           Console.WriteLine("Error: ({1}): {0}", error.Message,  error.NativeError);
  }
}
}

D:\Infx\work\cs>csc.exe /R:D:\infx\csdk410tc8w2\bin\netf20\IBM.Data.Informix.dll /nologo s.cs /platform:x86

两个特征都按照原样返回:

D:\Infx\work\cs>s
c1= Øø

D:\Infx\work\cs>

表中的数据可能不是真的来自1252.使用CLIENT_LOCALE = DB_LOCALE进行卸载或dbexport(因此没有完成GLS转换)并检查Ø是否为0xd8或0xF8(上/下)不,这意味着没有使用正确的语言环境插入“Ø”。

编辑:

如果表中有0x9D,则可能使用850而不是1252作为客户端代码集。 在850(在某些窗口中是cmd的默认代码集)'Ø'是0x9D而不是0xD8

D:\Infx>chcp 1252
Active code page: 1252

D:\Infx>echo Ø | od -x
0000000000      20D8    0A0D
0000000004

D:\Infx>chcp 850
Active code page: 850

D:\Infx>echo Ø | od -x
0000000000      209D    0A0D
0000000004

D:\Infx>    

如果你在表格中有这个:

D:\infx\ids12>dbaccess enus1252 -
Database selected.
> truncate t1;
Table truncated.
> insert into t1 values ('Ø');
1 row(s) inserted.
>
Database closed.
D:\infx\ids12>oncheck -pp enus1252:t1 256
addr             stamp    chksum nslots flag type         frptr frcnt next     p
rev
1:16444          725727918 d1d2   1      1    DATA         34    4054  0
0
    slot ptr   len   flg
    1    24    10    0
slot   1:
0: 9d 20 20 20 20 20 20 20 20 20                     .         ......

D:\infx\ids12>

C#会出现错误,因为从0x9D转换(1252中不应使用0x9D)

D:\Infx\work\cs>s
Update: ERROR [HY000] [Informix .NET provider]Invalid byte in codeset conversion input.
Error: (21000): [Informix .NET provider]Invalid byte in codeset conversion input.

D:\Infx\work\cs>