【发布时间】:2018-04-18 18:53:43
【问题描述】:
我尝试从 ASP.NET 控制台应用程序运行存储过程时遇到问题。
这就是我尝试在代码中获取结果的方式:
public static DataTable PerformStoredProcedure(int PracticeID, string CommandName)
{
DataTable dt = new DataTable();
try
{
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["DbConnString"].ToString()))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = CommandName;
cmd.Parameters.AddWithValue("@practiceID", PracticeID);
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dt);
}
}
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Rows[i].ItemArray.Length; j++)
{
Console.Write(dt.Rows[i].ItemArray[j] + ",");
}
Console.WriteLine();
}
}
}
程序运行后,我返回一个没有错误的空白数据集。但是,当我在 SQL Server Management Studio 中运行该过程时,我工作得很好。
您可能会注意到我在启动SqlCommand cmd 时没有使用new SqlCommand() 构造函数。那是因为查询很大并且需要一段时间才能运行,所以我认为这是一个超时问题。
按照here的建议,为了调整执行超时限制,我做了以下类。
class CommandFactory
{
public static int CommandTimeout
{
get
{
int commandTimeout = 0;
var configValue = ConfigurationManager.AppSettings["commandTimeout"];
if (int.TryParse(configValue, out commandTimeout))
return commandTimeout;
return 120;
}
}
我想我会把它包括在内只是为了避免混淆SqlCommand 是否被正确初始化。在那次调整之后,我开始遇到命令返回空白数据表的问题。我认为这可能与数据表dt 的最小容量有关,因此我对其进行了调整,如您在原始代码中所见。
我已经进行了额外的研究并提出了建议的修复方法,但这些建议无济于事:
1.设置不计数
2.使用数据适配器代替数据读取器
3.这是最详细的答案。论坛中提出了一些建议,但最终的解决方案与数据库默认使用的视图和阻止对所需数据的访问有关。我已经与我们的 DBA 确认我们不会这样做。
就像我之前提到的,存储过程中包含的查询是巨大的,我没有将它包含在此处,因为它的大小和这篇文章已经足够长了。我再次确认该程序在 SSMS 中运行。
我也没有包含示例结果集,因为数据包含受限信息。
感谢您提供的任何帮助。
更新:
我添加了另一个调用存储过程的方法,以查看问题是否特定于被调用的特定过程。第二个存储过程也返回了一个空白数据表,因此问题不是特定于任何一个过程。 (我还确认第二个程序正在运行并在 SSMS 中返回行)
这让我相信该项目的 app.config 文件有问题。然后,我添加了第三种方法,该方法在解决方案中的另一个项目上调用存储过程。然而,即使这样也返回了一个空白的数据表。
我想我会在遇到它们时提供线索。
【问题讨论】:
标签: c# datatable sqlcommand