猿问

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

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

"";

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


慕娘9325324
浏览 288回答 2
2回答

交互式爱情

自 Redbook Mike 参考文献发布以来,似乎有一些改进。在 7.1 DB2 for i .NET Provider Technical Reference(作为 iAccess for Windows 或较新的 ACS Windows 应用程序包的程序员工具包组件的一部分安装)中有几个感兴趣的属性......iDB2Connection.CharBitDataAsString 属性获取一个布尔值,该值指示是否应将标记为 CCSID 65535 的字符位数据转换为字符串数据。iDB2ProviderSettings.CharBitDataCcsid 属性指定当 CharBitDataAsString 属性设置为 True 时用于转换 iDB2CharBitData 和 iDB2VarCharBitData 类型的 CCSID。当 CharBitDataAsString 设置为 False 时,将忽略此属性。

慕莱坞森

此类问题的最佳资源是 IBM Redbook Integrating DB2 Universal Database for iSeries with Microsoft ADO.NET。在页 151 上,有一个图表将OLE DB 提供程序IBMDA400或IBMDASQLOLE DB 提供程序的功能与IBM.Data.DB2.iSeries.NET 提供程序进行了比较。它说:Force Translate未由 IBM.Data.DB2.iSeries 提供程序实现。在第 90 页的“iDB2CharBitData 和 iDB2VarCharBitData”中阅读有关处理标记为 CCSID 65535 的字符数据的信息。还值得注意的是,在 4.5.2 节中列出了您可以放在连接字符串上的属性,没有与您尝试指定的内容相似的内容。这意味着如果您使用 OLE DB 提供程序,而不是 .NET 提供程序,您可能能够对连接字符串执行此转换。它确实提供了一些技术,您应该能够使用这些技术来清理您的查询并允许您继续使用IBM.Data.DB2.iSeries提供程序(我通常更喜欢)。它们CAST在第 91 页显示了您当前使用的技术,然后在第 93 页显示了可用于iDB2DataReader, 调用方法GetiDB2CharBitData或的替代技术GetiDB2VarCharBitData。还有一个.ToString您可能更喜欢的重载: .ToString(CCSID). 我认为这第二种技术在客户端(在 .NET 提供程序中)执行翻译,而您当前的技术在服务器端(在 iSeries SQL 代码中)执行翻译。
随时随地看视频慕课网APP
我要回答