如何转换 AS400 ADO.Net 连接字符串中的 CCSID 65535 个字符
How to convert CCSID 65535 characters in AS400 ADO.Net connection string
我正在尝试进行设置,以便我可以从 AS400 数据库中读取二进制数据,而不必在每个选定的列上放置 "CAST(TABLE.COL AS CHAR(29) CCSID 37) COL"。每次都这么说很痛苦,更不用说将列大小耦合到 C# 代码了(我想我可以将所有内容转换为 VARCHAR(9999),但是...)。
我以为我可以通过 ADO.Net 的连接字符串来做到这一点。但是,在尝试了我阅读过的各个页面中的每个建议设置以尝试使其正常工作之后,它们都给出了 "The ConnectionString property is invalid." 错误。
我已经尝试了以下每一种方法,它们都给出了相同的错误:
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 红皮书 Integrating DB2 Universal Database for iSeries with
微软 ADO.NET.
在第 151 页上,有一张图表比较了 IBMDA400
或 IBMDASQL
OLE DB 提供程序与 IBM.Data.DB2.iSeries
.NET 提供程序的功能。它说:
Force Translate Not implemented by the IBM.Data.DB2.iSeries provider.
Read about handling character data tagged with CCSID 65535 in
“iDB2CharBitData and iDB2VarCharBitData” on page 90.
还值得注意的是,在第 4.5.2 节中,它列出了您可以放在连接字符串上的属性,但与您尝试指定的内容没有任何相似之处。这意味着如果您使用 OLE DB 提供程序而不是 .NET 提供程序,您可以对连接字符串执行此转换。
它确实提供了一些您应该能够用来清理查询并允许您继续使用 IBM.Data.DB2.iSeries
提供程序(我通常更喜欢)的技术。他们在第 91 页展示了您当前使用的 CAST
技术,然后在第 93 页展示了可用于 iDB2DataReader
调用方法 GetiDB2CharBitData
或 [=17= 的替代技术].还有一个您可能更喜欢的 .ToString
重载:.ToString(CCSID)
。我认为第二种技术在客户端(在 .NET 提供程序中)执行转换,而您当前的技术在服务器端(在 iSeries SQL 代码中)执行转换。
自从 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 时,此 属性 将被忽略。
我正在尝试进行设置,以便我可以从 AS400 数据库中读取二进制数据,而不必在每个选定的列上放置 "CAST(TABLE.COL AS CHAR(29) CCSID 37) COL"。每次都这么说很痛苦,更不用说将列大小耦合到 C# 代码了(我想我可以将所有内容转换为 VARCHAR(9999),但是...)。
我以为我可以通过 ADO.Net 的连接字符串来做到这一点。但是,在尝试了我阅读过的各个页面中的每个建议设置以尝试使其正常工作之后,它们都给出了 "The ConnectionString property is invalid." 错误。
我已经尝试了以下每一种方法,它们都给出了相同的错误:
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 红皮书 Integrating DB2 Universal Database for iSeries with 微软 ADO.NET.
在第 151 页上,有一张图表比较了 IBMDA400
或 IBMDASQL
OLE DB 提供程序与 IBM.Data.DB2.iSeries
.NET 提供程序的功能。它说:
Force Translate Not implemented by the IBM.Data.DB2.iSeries provider. Read about handling character data tagged with CCSID 65535 in “iDB2CharBitData and iDB2VarCharBitData” on page 90.
还值得注意的是,在第 4.5.2 节中,它列出了您可以放在连接字符串上的属性,但与您尝试指定的内容没有任何相似之处。这意味着如果您使用 OLE DB 提供程序而不是 .NET 提供程序,您可以对连接字符串执行此转换。
它确实提供了一些您应该能够用来清理查询并允许您继续使用 IBM.Data.DB2.iSeries
提供程序(我通常更喜欢)的技术。他们在第 91 页展示了您当前使用的 CAST
技术,然后在第 93 页展示了可用于 iDB2DataReader
调用方法 GetiDB2CharBitData
或 [=17= 的替代技术].还有一个您可能更喜欢的 .ToString
重载:.ToString(CCSID)
。我认为第二种技术在客户端(在 .NET 提供程序中)执行转换,而您当前的技术在服务器端(在 iSeries SQL 代码中)执行转换。
自从 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 时,此 属性 将被忽略。