【发布时间】: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(小写)并且您尝试以大写形式传递参数。我不记得这是否区分大小写,现在无法检查。
标签: c# sql-server collation case-sensitive