C# ASP.NET存储过程调用不会返回任何行,但会在Management Studio中返回!
我有一个令人难以置信的奇怪问题,我已经试着解决了将近一天了,现在我遇到了困难,需要帮助 我在Windows7电脑上创建了一个.NET4c#网站,新安装了SQLServer2008ExpressR2,一切正常 我已经上传了数据库和网站。 该网站现在位于Windows Web Server 2008 R2上(带有service pack 1) 数据库位于另一台运行Windows server 2008 R2标准和SQL server 2008的服务器上 R2 网站的其余部分运行良好,与数据库的连接也很好,除了一个页面,我已经将其缩小为一个不返回任何行的存储过程调用 我简化了对这一问题的呼吁:C# ASP.NET存储过程调用不会返回任何行,但会在Management Studio中返回!,c#,asp.net,sql-server-2008,sql-server-2008-r2,C#,Asp.net,Sql Server 2008,Sql Server 2008 R2,我有一个令人难以置信的奇怪问题,我已经试着解决了将近一天了,现在我遇到了困难,需要帮助 我在Windows7电脑上创建了一个.NET4c#网站,新安装了SQLServer2008ExpressR2,一切正常 我已经上传了数据库和网站。 该网站现在位于Windows Web Server 2008 R2上(带有service pack 1) 数据库位于另一台运行Windows server 2008 R2标准和SQL server 2008的服务器上 R2 网站的其余部分运行良好,与数据库的连接也
DataSet ds = new DataSet();
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString());
SqlCommand cmd = new SqlCommand("MYSP 'param1', param2, param3", conn);
cmd.CommandType = CommandType.Text;
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
Response.Write("ROWS COUNT IN GET DS " + ds.Tables[0].Rows.Count);
conn.Close();
cmd.Dispose();
return ds;
对于上述任何一种情况,如果我在本地PC上针对数据库的精确副本运行此命令,它将返回2行,如果我在live server上的Sqlserver Management Studio中直接运行此命令,它将返回2行,但是如果我在live server上通过ASP.net运行此命令,它将不返回任何行
任何人都能发光吗??!我快疯了
更新即使我使用的是命令类型的文本,我也尝试将其作为命令类型的存储过程,使用单独的参数(如下所示),但没有任何区别
cmd.CommandType = StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@param1", param1));
cmd.Parameters.Add(new SqlParameter("@param2", param2));
cmd.Parameters.Add(new SqlParameter("@param3", param3));
更新
谢谢大家的评论
答案是:
网站使用的db用户设置为“英式英语”(默认情况下)。。我没有意识到这是一个新的服务器
在其他任何地方,用户都被设置为“英语”,因此将用户更改为英语可以修复此问题 如果调用的是存储过程,则应将
SqlCommand.CommandType
设置为存储过程:
DataSet ds = new DataSet();
using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["myConn"].ToString()))
using(SqlCommand cmd = new SqlCommand("MYSP 'param1', param2, param3", conn))
{
cmd.CommandType = CommandType.StoredProcedure; <== STORED PROCEDURE !!
......
}
然后再次使用
CommandType.Text使用SQL Server Profiler捕获生产ASP.NET服务器发出的实际存储过程调用,然后对开发设置执行相同的操作。确保输入的参数相同
如果参数在该级别匹配,唯一可能的答案是,您同事的复杂SP有一些非确定性组件正在破坏您的结果。您了解整个SP吗?通常要尝试的事情:当您登录到数据库以运行查询时,您是以asp.net进程使用的同一用户的身份这样做的吗?您可能会发现,如果您使用两个用户,他们的设置可能不同(一个为EN-GB,一个为EN-US),这会给您带来奇怪的基于日期的问题?另外,您可能会发现两者的priveldges不同,因此其中一个具有tempDb权限,而另一个则没有?好的,这里很随意,但我注意到您正在执行的是ds.Tables[0].Rows.Count
,我想知道您的存储过程是否返回多个数据表?到目前为止,最好的答案是@pseudocoder使用探查器查看实际调用的内容。我还建议您在代码中添加一个断点,并检查即将返回的数据集。该服务器的web.config中是否存在myConn?有有效的证明吗?@David谢谢你的回答,是的,它是有效的,因为其他SP工作正常。我知道通常是这样的,但我将我的参数与SP一起传递(用于测试目的),因此它实际上是文本。如果我将其更改为存储过程,它会抛出一个错误,说“找不到存储过程MYSP,param1,param2,param3”。无论哪种方式,它在我的本地电脑上都能正常工作machine@Bex:那么您需要单独添加参数。。。。。。或者将“文本”更改为exec MYSP……
这就是在我试图缩小问题范围(我的意思是使用单独的参数)但它没有返回任何结果之前,live网站的情况。这就是为什么我把它改为文本。在我的本地机器上,它仍然可以这样工作!是否验证连接字符串是否指向查询工作的同一数据库?另外,我刚刚使用SqlCommand进行了测试,您不必指定cmd类型的存储过程,无论是否使用exec,我不知道这一点。不管怎样,我认为您需要验证您的数据库是否相同。@Bex。您是否尝试过为SqlCommand
将参数分为“normal”SqlParameter
?好的,部分答案是这一点,我的同事写了一个令人兴奋的SP!live服务器上的用户默认为“British English”和其他任何地方的“English”,存储过程执行一些日期解析!所以我把我的数据库用户改成了“英语”,一切都很好!耶!谢谢你的投票。我在这里有很多经验,因为这总是发生在我们的服务器上
using(SqlCommand cmd = new SqlCommand("exec dbo.MYSP 'param1', param2, param3", conn))