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

C# 如何转换AS400 ADO.Net连接字符串中的CCSID 65535字符,c#,ado.net,connection-string,ibm-midrange,binary-data,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属性无效”错误 我尝试了以下每种方法,它们都给出了相同的错误:

我正在尝试进行设置,这样我就可以从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" +
"";

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

解决此类问题的最佳资源是IBM红皮书

在第151页,有一个图表比较了
IBMDA400
IBMDASQL
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
GetiDB2VarCharBitData
。您可能更喜欢
.ToString
重载:
.ToString(CCSID)
。我认为第二种技术在客户端(在.NET提供程序中)执行翻译,而您当前的技术在服务器端(在iSeries SQL代码中)执行翻译。

看起来自从红皮书Mike参考资料发布以来,已经有了增强

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

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

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

很好的信息…但最好的解决方法是首先用正确的CCSID标记数据。看起来他们可能添加了一些功能…7.1 Tech Ref具有iDB2ProviderSettings.CharBitDataCcsid属性指定当CharBitDataAsString属性设置为时用于转换iDB2CharBitData和iDB2VarCharBitData类型的CCSID对。当CharBitDataAsString设置为False时,将忽略此属性。它可以工作!有趣的是,如果我只添加“CharBitDataAsString=True”,那么_connection.CharBitDataCcsid的值是-1。但它似乎仍然有效。@Sarov可能在作业中使用“默认CCSID”