使用 IBM.Data.DB2.ISeries 提供程序在数据库中插入特殊字符

2024-01-26

我在使用 VB.Net 编写的依赖于 iSeries 数据库的应用程序时遇到问题。用户可以保存笔记,这些笔记(非常)通常是从他们的邮箱复制/粘贴的。

但许多邮件包含无效字符,当数据保存到数据库时会触发 iDb2ConversionException。

目前,我清理数据,用匹配的 html 实体替换无效字符,但我真的不喜欢这种方法:

  • 我必须维护一个转换列表,尽管我设法覆盖了大多数无效字符,但总会出现新的字符。
  • 如果我在 Client Access 中使用 STRSQL 运行相同的命令,我实际上可以插入这些无效字符。
  • 我们有许多固定长度的字段,并且用 HTML 实体替换字符使得在 UI 级别强制执行最大字符串长度变得更加困难

如果我不使用参数,相同的命令也适用于 ADO.NET(但随后我必须再次清理用户输入,所以总而言之......它只是将问题转移到其他地方)

Dim command = connection.CreateCommand()
command.CommandText = "UPDATE table SET field = '€€€€€]]]]]]]]]]]°°°°°°§§§§§' where ...."
command.ExecuteNonQuery() ' Executes successfully '

Dim command = connection.CreateCommand()
command.CommandText = "UPDATE table SET field = @value where ...."
command.DeriveParameters()
command.Parameters("@value").Value = "'€€€€€]]]]]]]]]]]°°°°°°§§§§§'"
command.ExecuteNonQuery() ' Throws iDb2ConversionException '

我的连接字符串如下:

Datasource=server;DataBase=DBNAME;DefaultCollection=DBCOLLECTION;HexParserOption=Binary;LibraryList=LIBRARIES;Naming=SQL;DataCompression=True;AllowUnsupportedChar=true;

是否有任何选项可以成功地将这些字符写入数据库而不会出现该异常?


嗯,终于明白了。所需要做的就是更改物理文件的 CCSSID(它已经用 CCSID 297 编译了一段时间)。

CHGPF FILE(MYLIB/MYFILE) CCSID(xxxx)

就我而言,我使用的是 CCSID 65535。但是,对于这个,存储字符串并不那么简单,我必须提取字符串的字节数组:

Dim command = connection.CreateCommand()
command.CommandText = "UPDATE table SET field = @value where ...."
command.DeriveParameters()
command.Parameters("@value").Value = Encoding.Unicode.GetBytes("'€€€€€]]]]]]]]]]]°°°°°°§§§§§'")
command.ExecuteNonQuery() ' Works... '

但好处是我现在几乎可以存储任何角色:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IBM.Data.DB2.ISeries 提供程序在数据库中插入特殊字符 的相关文章

随机推荐