C# ASP.NET存储过程调用不会返回任何行,但会在Management Studio中返回!

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 网站的其余部分运行良好,与数据库的连接也

我有一个令人难以置信的奇怪问题,我已经试着解决了将近一天了,现在我遇到了困难,需要帮助

我在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))