如何在AS400 ADO.Net连接字符串中转换CCSID 65535字符

时间:2018-08-08 18:08:31

标签: c# ado.net connection-string ibm-midrange binary-data

我正在尝试进行设置,以便可以从AS400数据库读取二进制数据,而不必在每个选定列上都添加“ CAST(TABLE.COL AS CHAR(29)CCSID 37)COL”。每次都很难说,更不用说将列大小与C#代码耦合了(我想我可以将所有内容都转换为VARCHAR(9999),但是...)。

我想我可以通过ADO.Net的连接字符串来做到这一点。但是,在尝试阅读各个页面上的所有建议设置以使其正常工作之后,它们都给出了“ ConnectionString属性无效”的信息。错误。

我尝试了以下每种方法,它们都给出相同的错误:

var connectionString = "DataSource=" + /*blah blah...*/ + 
//"; CCSID=37; TRANSLATE=1" +
//"; BinAsChar=true; CCSID=37;" +
//"; BinAsChar=true; CCSID=37; TRANSLATE=1" +
//"; BinAsChar=true; CCSID=37; Force Translate=1" +
//"; BinAsChar=true; CCSID=37; ForceTranslation=1" +
//"; CCSID=37; ForceTranslation=1" +
//"; ForceTranslation=1" +
//"; CCSID=37" +
//"; Host CCSID=37" +
//"; CharsetFor65535=0" +
//"; CCSID=EBCDIC" +
"";

有什么办法可以使它正常工作吗?还是我必须继续污染所有查询?

2 个答案:

答案 0 :(得分:3)

自Redbook Mike参考发布以来,似乎有所增强。

在7.1 DB2 for i .NET Provider技术参考(作为Windows iAccess或新版ACS Windows应用程序包的程序员工具包组件的一部分安装)中,有几个有趣的属性...

iDB2Connection.CharBitDataAsString属性
获取一个布尔值,该布尔值指示是否应将用CCSID 65535标记的字符位数据转换为字符串数据。

iDB2ProviderSettings.CharBitDataCcsid属性
当CharBitDataAsString属性设置为True时,指定用于转换iDB2CharBitData和iDB2VarCharBitData类型的CCSID。当CharBitDataAsString设置为False时,将忽略此属性。

答案 1 :(得分:2)

有关此类问题的最佳资源是IBM红皮书Integrating DB2 Universal Database for iSeries with Microsoft ADO.NET

在第151页上,有一张图表将IBMDA400IBMDASQL OLE DB提供程序与IBM.Data.DB2.iSeries .NET提供程序的功能进行了比较。它说:

  

强制翻译未由IBM.Data.DB2.iSeries提供程序实现。   阅读有关处理带有CCSID 65535标记的字符数据的信息   第90页上的“ iDB2CharBitData和iDB2VarCharBitData”。

还值得注意的是,在第4.5.2节中列出了可以放在连接字符串上的属性,没有什么与您尝试指定的相似。这意味着如果使用OLE DB提供程序而不是.NET提供程序,则可以对连接字符串进行此转换。

它确实提供了一些技巧,您应该可以使用这些技巧来清理查询,并允许您使用IBM.Data.DB2.iSeries提供程序(我通常会更喜欢)。它们在第91页上显示了您当前正在使用的CAST技术,然后在第93页上显示了可以在iDB2DataReader上使用的另一种技术,调用了方法GetiDB2CharBitData或{{1} }。还有一个GetiDB2VarCharBitData重载,您可能更喜欢:.ToString。我认为第二种技术是在客户端(在.NET提供程序中)执行转换,而您当前的技术是在服务器端(在iSeries SQL代码中)执行转换。