我有一个存储过程,需要在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。
答案 0 :(得分:3)
我会将您的代码修改为:
using(var dbConnection = new SqlConnection("..."))
using(var command = new SqlCommand(query, dbConnection))
{
dbConnection.Open();
...
}
根据Microsoft指南,在using块中处理连接池始终是一个好主意:
为确保始终关闭连接,请打开连接 在using块内部,如以下代码片段所示。 这样可以确保当 代码退出代码块。
您正在检查连接是否已关闭,如果连接处于空闲状态该怎么办?通过使用using
语法,您可以实现处理。因此它将正确关闭连接,因此除非您使用单例连接,否则无需检查连接是否已关闭。
在阅读完您的问题后,您可能不仅会遇到我指出的一个问题。我建议使用可以访问您要查找的特定数据的服务帐户,使该应用程序可以访问而不是集成的安全性。