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

本文关键字:返回 但在 Management Studio 任何行 调用 NET ASP 存储过程 | 更新日期: 2023-09-27 18:01:59

我有一个难以置信的奇怪的问题,我已经试图解决了将近一天,我现在对砖墙,需要帮助!

我在我的Windows 7 PC上创建了一个。net 4 c#网站,并安装了新安装的SqlServer 2008 Express R2,一切正常。

我已经上传了数据库和网站该网站现在在Windows Web Server 2008 R2(带有service pack 1)上数据库在不同的服务器上运行Windows server 2008 R2标准版和SQL server 2008R2。

网站的其余部分运行良好,连接到数据库很好,除了一个页面,我已经将其缩小到一个存储过程调用,不返回任何行。

我将调用简化为:

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行,如果我直接在Sqlserver Management Studio上运行它,它返回2行,但是如果我通过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用户设置为"British English"(默认)..我没有意识到这一点,因为这是一个新的服务器!

在其他地方用户被设置为"英语",所以将用户更改为英语修复它!

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

通常要尝试的事情:当您登录到数据库运行查询时,您是否以asp.net进程正在使用的相同用户这样做?您可能会发现,如果使用两个用户,它们的设置可能不同(一个为EN-GB,一个为EN-US),这会给您带来基于日期的奇怪问题。此外,您可能会发现两者的权限不同,因此一个具有tempDb权限,而另一个没有。

如果您调用的是存储过程,则应该将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 !!
     ......
}

Update:由于您正在执行带有参数的存储过程,因此您可能应该使用以下方式:

using(SqlCommand cmd = new SqlCommand("exec dbo.MYSP 'param1', param2, param3", conn))

然后再次使用CommandType.Text

使用SQL Server Profiler捕捉实际的存储过程调用,因为它是由生产ASP发出的。. NET服务器,然后对您的开发设置执行相同的操作。请确保输入的参数相同。

如果参数在该级别上匹配,那么唯一可能的答案似乎是您的同事的复杂SP具有一些不确定的组件,这些组件正在破坏您的结果。你了解整个SP吗?

好的,狂野的镜头在这里,但我注意到你正在做ds.Tables[0].Rows.Count,我想知道你的存储过程是否返回多个数据表?到目前为止,最好的答案是@pseudocoder使用分析器来查看实际被调用的内容。我还建议在代码中设置断点,并检查返回的数据集。

相关文章: