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

时间:2018-11-08 17:17:35

标签: c# sql asp.net asp.net-4.5

我有一个存储过程,需要在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];
   }
}

即使SP在SSMS中运行,上面的代码也将返回0行。调试时,连接字符串和参数全部正确,没有问题。连接字符串为:

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

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

ASP.NET stored proc call bringing back no rows, but does in Management Studio!

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

1 个答案:

答案 0 :(得分:3)

我会将您的代码修改为:

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

根据Microsoft指南,在using块中处理连接池始终是一个好主意:

  

为确保始终关闭连接,请打开连接   在using块内部,如以下代码片段所示。   这样可以确保当   代码退出代码块。

您正在检查连接是否已关闭,如果连接处于空闲状态该怎么办?通过使用using语法,您可以实现处理。因此它将正确关闭连接,因此除非您使用单例连接,否则无需检查连接是否已关闭。

在阅读完您的问题后,您可能不仅会遇到我指出的一个问题。我建议使用可以访问您要查找的特定数据的服务帐户,使该应用程序可以访问而不是集成的安全性。