【发布时间】:2011-10-25 17:27:58
【问题描述】:
SQL Server 2005/2008、db=user=schema=owner='John'、ASP.net 2.0.50727、vb、IIS7
我正在将网站从一台服务器移动到另一台服务器。这段代码在装有 SQL Server 2005 的旧服务器上运行良好。
Dim sqlCmdVehicle As SqlCommand = New System.Data.SqlClient.SqlCommand("SP_Name", sqlConn)
Dim dtVehicle As New DataTable
With sqlCmdVehicle
.Parameters.AddWithValue("FullStockNo", "N102010")
.CommandType = CommandType.StoredProcedure
End With
sqlConn.Open()
sqlAdapter.SelectCommand = sqlCmdVehicle
sqlAdapter.Fill(dtVehicle)
数据库已备份并在新服务器上成功恢复。当我尝试使用新的 SQL Server 2008 运行时,出现错误:
找不到存储过程“SP_Name”。指向最后一行。
我可以看到带有“MS SQL 管理工作室”的过程不是 dbo.SP_Name 而是 John.SP_Name
当我改变时
System.Data.SqlClient.SqlCommand("SP_Name", sqlConn)
进入
System.Data.SqlClient.SqlCommand("John.SP_Name", sqlConn)
一切正常,但所有其他程序和代码中的许多此类地方都是一样的:(
我收到了http://msdn.microsoft.com/en-us/library/ms189915.aspx,但调用者的默认架构是正确的。 同样,在旧盒子上一切正常。
我应该在 SQL 中修复什么以允许在没有明确提及用户/模式名称的情况下运行 SP?
谢谢。
========================================
很遗憾,我没有找到好的解决方案。我采取的方法是将整个项目的 SP_Name 搜索并替换为 John.SP_Name。感谢所有参与者。
【问题讨论】:
-
来自您发布的帮助文件
SQL Server 2008 uses the calling database collation when matching system procedure names. Therefore, you should always use the exact case of system procedure names in your application. For example, this code will fail if executed in the context of a database that has a case-sensitive collation: -
"例如,如果在具有区分大小写排序规则的数据库上下文中执行此代码将失败:" - 并且注释已结束或我看不到结尾。我刚刚检查了 login(不是用户)John,发现没有映射到 John DB。我可以标记复选框,显示正确的用户名和架构,按“确定”,再次打开此登录,并看到此复选框干净。没有错误消息,日志中没有错误。请指教。
-
@JonH "例如,如果在具有区分大小写排序规则的数据库的上下文中执行此代码将失败:" - 并且注释已结束或我看不到结尾。
标签: asp.net sql-server sql-server-2005 sql-server-2008 stored-procedures