【问题标题】:How to convert CCSID 65535 characters in AS400 ADO.Net connection string如何在 AS400 ADO.Net 连接字符串中转换 CCSID 65535 个字符
【发布时间】:2018-08-08 18:08:31
【问题描述】:

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

有没有办法让它工作?还是我必须继续污染我的所有查询?

【问题讨论】:

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


    【解决方案1】:

    自 Redbook Mike 参考文献发布以来,似乎有一些改进。

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

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

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

    【讨论】:

    • 有效!有趣的是,如果我只添加“; CharBitDataAsString=True”,那么_connection.CharBitDataCcsid 的值为-1。但它似乎仍然有效。
    • @Sarov 可能在工作中使用“默认 CCSID”
    【解决方案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 的字符数据的信息 “iDB2CharBitData 和 iDB2VarCharBitData”(第 90 页)。

    还值得注意的是,在第 4.5.2 节中,它列出了您可以放在连接字符串上的属性,没有任何类似于您要指定的内容。这意味着如果您使用 OLE DB 提供程序,而不是 .NET 提供程序,则可以对连接字符串执行此转换。

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

    【讨论】:

    • 好信息...但最好的解决方法是首先使用正确的 CCSID 标记您的数据。
    • 看起来他们可能添加了一些功能... 7.1 技术参考具有 iDB2ProviderSettings.CharBitDataCcsid 属性 指定当 CharBitDataAsString 属性设置为 True 时用于转换 iDB2CharBitData 和 iDB2VarCharBitData 类型的 CCSID。当 CharBitDataAsString 设置为 False 时忽略此属性。
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2015-09-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多