4

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

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 编写的。

谢谢-霍利斯

4

2 回答 2

4

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

来自BOL(强调我的):

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

于 2012-04-03T21:52:03.473 回答
2

变量的大小写敏感性由服务器级别排序规则控制,而不是数据库级别。请参阅有关同一主题的此问题

于 2012-04-03T21:42:46.070 回答