存储过程在SSMS中运行良好,但在C#中调用时不会返回行



我有一个存储过程,需要在C#中运行,并在HTML表中设置从SP返回的结果集。请注意,SP在SSMS中运行良好,并返回结果。

我使用的c#代码是(它在ASP 4.5项目中(:

SQLDatabase sqldb = new SQLDatabase();
using (SqlConnection sqlcn = new SqlConnection(sqldb.GetConnectionString().ToString()))
{
if (sqlcn.State == ConnectionState.Closed)
{
sqlcn.Open();
}
SqlCommand cmd = new SqlCommand("[MyStoredProcedure]", sqlcn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FromDate", Convert.ToDateTime(txtFrom.Value.ToString()));
cmd.Parameters.AddWithValue("@ToDate", Convert.ToDateTime(txtTo.Value.ToString()));
using (SqlDataAdapter a = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
a.Fill(ds);
dtExtra = ds.Tables[0];
}
}

上面的代码返回0行,即使SP在SSMS中工作。在调试过程中,连接字符串和参数都实现了,没有问题。连接字符串为:

<add name="DefaultDB" connectionString="Data Source=TestEnv;Initial Catalog=TestTable;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>

我不明白是什么原因造成的。我找到了下面的主题,但我已经在连接字符串中使用了Integrated Security=SSPI,所以它对我没有帮助。如果有任何建议,我们将不胜感激。

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

编辑:已解决谢谢@NineBerry。它变成了SP中介于/和使用之间的问题。在代码中将txtTo.Value更改为:DateTime.Today.AddDays(1).ToString("yyyy-MM-dd");解决了这个问题(以前是DateTime.Today.ToString("yyyy-MM-dd"),我应该将它包含在代码部分,我认为它与此无关,对不起(。更好的解决方案是使用>=<=而不是在/和关键字tho之间更新SP。

我会将您的代码修改为:

using(var dbConnection = new SqlConnection("..."))
using(var command = new SqlCommand(query, dbConnection))
{
dbConnection.Open();
...
}

根据微软的指导方针,在使用块中处理连接池总是一个好主意:

若要确保连接始终处于关闭状态,请打开连接在using块内部,如下面的代码片段所示。这样做可以确保在代码退出块。

您正在检查连接是否已关闭,如果连接空闲怎么办?通过使用using语法,您可以实现dispose。因此,它将正确地关闭您的连接,因此您不需要检查连接是否已关闭,除非您正在为连接使用singleton。

看完你的问题后,你可能会有不止我指出的一个问题。我建议您使用一个可以访问您所寻求的特定数据的服务帐户,应用程序可以访问该帐户,而不是集成的安全性。

最新更新