gpt4 book ai didi

c# - H2、DBDataAdapter、Locale 属性、列名和区分大小写(整理)

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:56 25 4
gpt4 key购买 nike

我们的应用程序使用 H2Sharp 从 C#(框架 v4)访问 H2 数据库。 H2Sharp继承了DBDataAdapter并实现了IDbDataAdapter。因此,我所询问的很可能适用于 SqlDataAdapter,但我想澄清一下环境细节。

最近我们注意到在不同计算机上访问同一个数据库时会出现问题。我们观察到以下代码有时有效,有时会抛出错误:

DataRow row;
// Fill the row
String s = row["id"];

错误是“Column id does not belong to table Abcde”。

该应用程序在运行 Win7 64 位、带有所有补丁的 Visual Studio 2010 的计算机上运行。复制到类似计算机的相同二进制文件和数据库会出现此错误。有趣的是,如果将行更改为

,则代码可以正常工作
String s = row["ID"];

DataTable 的“CaseSensitive”属性设置为 false,因此最初我们无法弄清楚发生了什么。

原来 DataTable 有一个“Locale”属性,它有一个默认的登录用户的 Locale(在“区域和语言”控制面板的“格式”选项卡下设置Windows 7 上的设置)。在它不起作用的机器上,用户区域设置为土耳其语,我们看到了“土耳其语 I 问题”(*) 的情况。

现在我了解了问题的本质,我正在尝试了解我有哪些选择可以解决它。我首先考虑是否有一种方法可以指定在不变文化中比较的列名等,但数据本身是在给定的语言环境中进行比较的。 H2 documentation不是很明确,但它的编写方式,听起来整个数据库都由一个主要设置控制。此外,SELECT * FROM INFORMATION_SCHEMA.COLLATIONS 不返回 Unicode,因此该选项似乎不可行。

此外,DataTable documentation还建议将区域设置用于“表内的字符串比较”,因此似乎没有选项可以为列/表名称与用户数据指定不同的行为。

我找到了 this post提到这个问题并且接受的解决方案是在表/列名称中使用“I”字符而不是“i”。但是,我认为此解决方案假定代码在字符串比较之前执行 ToUpper() 而不是 ToLower(),因此如果将来修改 DataTable 代码,它可能会被破坏。

那个帖子还有一个suggested solution将 SQL 服务器设置设置为 UTF-8。这看起来是一个更可行的解决方案。但是,我找不到对 H2 数据库执行此操作的方法(两者都是因为该设置似乎会影响整个数据库并且没有 UNICODE 选项)。

我感谢任何输入/帮助/指导。

(*) 土耳其语 I 问题:在土耳其语中,ToUpper(i) == İ, ToLower(I) == (ı)

最佳答案

我们继续 suggested solution在表/列名称中使用所有大写字母。即使这假设 DataTable 背后的代码正在执行 ToUpper() 而不是 ToLower() 来进行不区分大小写的比较,看起来此代码不太可能改变其行为(这会破坏所有使用 DataTable 进行不区分大小写比较的代码)。

关于c# - H2、DBDataAdapter、Locale 属性、列名和区分大小写(整理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8159042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com