通过 C# 查询时 SQL Server 2005 区分大小写

Posted

技术标签:

【中文标题】通过 C# 查询时 SQL Server 2005 区分大小写【英文标题】:SQL Server 2005 Case Sensitive when queried via C# 【发布时间】:2012-04-17 14:34:21 【问题描述】:

我在安装一个在多个客户站点上运行良好的产品时遇到了问题,我相信这个问题与他们数据库服务器上的排序规则设置有关。我的代码看起来像这样(由于代码是专有的,所以我更改了表和变量名称):

using (SqlCommand insertCommand = dbConnection.CreateCommand())

    insertCommand.CommandText = "INSERT INTO [myTable] ([valueOne] ,[valueTwo] ,[CreationDate]) VALUES (@valueTwo ,@valueTwo ,@creationDate);select IDENT_CURRENT('myTable');";
    insertCommand.Parameters.AddWithValue("@valueOne", "Value One");
    insertCommand.Parameters.AddWithValue("@valueTwo", "Value Two");
    insertCommand.Parameters.AddWithValue("@CreationDate", CreationDate);                    
    dbConnection.Open();
    object result = insertCommand.ExecuteScalar();
    dbConnection.Close();

这适用于大多数站点以及我们的开发和 QA 机器,但在这个站点上,我们收到一条错误消息,提示“必须声明标量变量“@creationDate”。我看到的主要差异是该站点具有排序规则值设置为 SQL_Latin1_General_CP1_CS_AS 并且我们的设置都是 SQL_Latin1_General_CP1_CI_AS。我为我们的数据库更改了此设置,但服务器仍设置为区分大小写的变体。这确实解决了我们在使用不同表时遇到的另一个问题(那个是表名,而不是参数名称),但由于某种原因,这仍然是一个问题。有没有人知道我如何能比通过和修复我们的代码库中的所有大小写差异更快地解决这个问题?

该站点使用 SQL Server 2005,我们的代码是用 C# 和 .NET 3.5 编写的。

谢谢 -霍利斯

【问题讨论】:

您是否有能力在服务器级别以及数据库级别进行更改?还是出于某种原因在服务器级别需要大小写敏感性? 实例(服务器)排序规则cannot be easily changed,并在数据库级别更改它并不能解决问题,因为变量(包括参数)始终是实例相关的(请参阅我的答案)。跨度> 命令文本包含@creationDate(小写)并且您尝试以大写形式传递参数。我不记得这是否区分大小写,现在无法检查。 【参考方案1】:

服务器的排序规则控制这些,这是设计使然。

来自BOL(强调我的):

标识符的排序规则取决于它所处的级别 定义。实例级对象的标识符,例如登录名和 数据库名称,被分配实例的默认排序规则。 数据库中对象的标识符,例如表、视图和 列名,被分配了数据库的默认排序规则。 变量、GOTO 标签、临时存储过程和临时 当连接上下文关联时,可以创建表 一个数据库,然后在上下文切换到时引用 另一个数据库。因此,变量的标识符,GOTO 标签和临时表在默认排序规则中 实例

【讨论】:

Lucero,非常感谢您的回答。我有点怀疑我在这方面不走运,但至少现在我明白了背后的原因,这总是一个优点。【参考方案2】:

变量的大小写敏感性由服务器级别的排序规则控制,而不是数据库级别。见this question on the same topic。

【讨论】:

从他的问题来看,不清楚他是否可以修改服务器级别的排序规则。在我看来,他只能在数据库级别修改它,否则他不会说。 “我为我们的数据库更改了此设置,但服务器仍设置为区分大小写的变体。这确实解决了我们在使用不同表时遇到的另一个问题(那个是表名,而不是参数名),但由于某种原因,它是这仍然是个问题。” 谢谢 Blake,我可能无法在这里更改服务器,所以我想我必须在代码中修复它……这不是最糟糕的事情,而且可能是长期的最佳解决方案。

以上是关于通过 C# 查询时 SQL Server 2005 区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2005 中回滚 UPDATE 查询?

如何在SQL Server 2005中回滚UPDATE查询?

sql server 2005 中的分区问题?

SqlDataReader C#,SQL Server 2005,VS 2008

如何查询数据库文化 (SQL Server 2005)?

C# 将 DateTime 转换为 Sql Server 2005 格式