C# H2、DBDataAdapter、区域设置属性、列名和区分大小写(排序规则)

C# H2、DBDataAdapter、区域设置属性、列名和区分大小写(排序规则),c#,sql,collation,h2,dataadapter,C#,Sql,Collation,H2,Dataadapter,我们的应用程序使用H2Sharp从C Framework v4访问H2数据库。H2Sharp继承DBDataAdapter并实现IDbDataAdapter。因此,我所问的很可能适用于SqlDataAdapter,但我想澄清环境细节 最近,我们注意到在不同的计算机上访问同一数据库的问题。我们观察到以下代码有时有效,有时抛出错误: DataRow row; // Fill the row String s = row["id"]; 错误是列id不属于表Abcde 该应用程序在运行Win7 64位

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

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

DataRow row;
// Fill the row
String s = row["id"];
错误是列id不属于表Abcde

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

String s = row["ID"];
DataTable的区分大小写属性设置为false,因此最初我们无法确定发生了什么

事实证明,DataTable有一个Locale属性,该属性具有Windows 7上“区域和语言控制面板设置”中“格式”选项卡下设置的登录用户的默认区域设置。在无法工作的机器上,用户语言环境设置为Turkish,我们看到了Turkish I问题*

现在我明白了问题的本质,我正试图了解解决问题的方法。我首先考虑的是,是否有一种方法可以指定列名等在固定区域性中进行比较,但数据本身在给定区域设置中进行比较。虽然不是很明确,但从编写方式来看,整个数据库似乎由一个主设置管理。此外,SELECT*FROM INFORMATION\u SCHEMA.COLLATIONS不返回Unicode,因此此选项似乎不可能

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

我发现它提到了这个问题,公认的解决方案是在表/列名中使用I字符而不是I。然而,我认为这个解决方案假设代码在字符串比较之前是在执行touper而不是ToLower,因此如果将来修改DataTable代码,它可能会被破坏

该帖子还提供了将SQL server设置设置为UTF-8的功能。这看起来是一个更可行的解决方案。然而,我找不到一种方法来同时对H2数据库进行设置,因为该设置似乎会影响整个数据库,并且没有UNICODE选项

我感谢任何意见/帮助/指导


*土耳其语I问题:在土耳其语中,ToUpperi==İ,ToLowerI==ı

异常是否有堆栈跟踪?你能把它寄出去吗

设置排序规则没有帮助,因为排序规则只影响数据列值而不影响标识符

对于标识符,H2使用toUpperCaseLocale.ENGLISH,因此不再受土耳其问题的影响;这曾经是个问题,但那是多年前的事了


我看了H2Sharp的源代码,没有发现使用ToUpper/ToLower的问题。我也没有找到错误消息列。。。不属于表。。。在那里或H2中。

我们继续使用表/列名中的所有大写字母。尽管这假设DataTable背后的代码正在进行不区分大小写的比较,而不是进行不区分大小写的比较,但这段代码似乎不太可能改变其行为,这将破坏所有使用DataTable进行不区分大小写比较的代码。

感谢您的回复。了解H2和H2Sharp在标识符名称方面的行为是很好的。我检查了异常堆栈,只有我的应用程序。打开first chance exceptions,我看到是System.Data.DataRow使用以下堆栈抛出消息:System.Data.dll!System.Data.DataRow.GetDataColumnstring columnName System.Data.dll!System.Data.DataRow.this[string].getstring columnName似乎H2在此问题中没有参与。不过,如果您对我应该如何解决这个问题有任何指导或建议,我很乐意听取他们的意见。