DB2 iSeries二进制到字符串错误

本文关键字:字符串 错误 二进制 iSeries DB2 | 更新日期: 2023-09-27 18:10:58

我正在使用IBM.Data.DB2在c#中读取DB2 iSeries数据。

System.InvalidCastException: A conversion error occurred converting binary to string data.
   at IBM.Data.DB2.iSeries.MPDataConverter.ConvertPtrToString(IntPtr pointer,
   Int32 length, UInt16 jobccsid)

让我困惑的是,我甚至不能将查询的结果读到像这样的对象中:

object o = reader.GetValue(7);

99%的记录都可以正常工作,但对少数记录抛出异常。

更有趣的是,如果我使用ODBC读取数据,它可以很好地用于所有记录。

我在连接字符串中尝试了这两种方法,它们都连接成功,但它们没有解决转换错误:

iDB2ConnectionStringBuilder sb = new iDB2ConnectionStringBuilder();
sb.DataSource = "foo.com";
sb.UserID = "uid";
sb.Password = "pw";
sb.LibraryList = "LIB1";
sb.CharBitDataAsString = true;
sb.Naming = iDB2NamingConvention.SQL;
string cs = string.Format("DataSource={0};UserID={1};Password={2};" +
    "Naming={3};LibraryList={4};CharBitDataAsString=true;",
    "foo.com", "uid", "pw", "SQL", "LIB1");

DB2 iSeries二进制到字符串错误

这是一种变通方法,而不是解决方案,但老实说,如果没有我在这里得到的反馈,我甚至不会有这个。我知道这不是很理想,但是如果将来有人被这个问题逼到墙角,那就是选项。

SELECT
  bzaitx, bzbldt, bzanva, bzcqcd, bzgncd, bzaldt, bzabtm,
  case when hex (bzafvn) != '00000000000000000000' then bzafvn end, 
  bzagvn, bzamdt, bzactm, bzahvn,
  case when hex (bzaivn) != '00000000000000000000' then bzaivn end
FROM foo.bar

不管怎样,它已经解决了这个问题。

而且,作为感兴趣的注释,这影响了130万条记录中的90条。