执行Reader命令很慢

时间:2018-02-15 16:52:52

标签: c# sql-server

我正在尝试从C#在SQL Server中运行存储过程。存储过程在SSMS中运行良好。拉这些记录需要45秒。但是在C#中,同一个调用会收到超时错误。这可能是什么问题? XML是C#中网格中表的主键列表。所以它可以有1行或数百行。存储过程可以很好地解析它并插入带有其他数据的临时表。

SqlConnection connection = new SqlConnection(connectionstring);
ce.Database.Initialize(force: false);

connection.Open();

SqlCommand cmd = new SqlCommand("usp_GetAllAccounts", connection);
cmd.CommandType = System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@LoanList", DBNull.Value);
cmd.Parameters.AddWithValue("@LoanIdFlagBit",detailModel.activeFlag);
cmd.Parameters.AddWithValue("@DataDtFrom", detailModel.fromDataDt);
cmd.Parameters.AddWithValue("@DataDtTo",detailModel.toDataDt)
cmd.Parameters.AddWithValue("@EffDtFrom",detailModel.fromEffDt)
cmd.Parameters.AddWithValue("@EffDtTo", detailModel.toEffDt)
cmd.Parameters.AddWithValue("@JournalDetailId", detailModel.JournalDetailId)
cmd.Parameters.AddWithValue("@JournalDetailIdList", journalDetailList).DbType = DbType.Xml;

SqlDataReader reader = cmd.ExecuteReader();

我的存储过程代码如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

    @LoanList XML,
    @LoanIdFlagBit BIT = 1, 
    @DataDtFrom SMALLDATETIME = NULL,
    @DataDtTo SMALLDATETIME = NULL,
    @EffDtFrom SMALLDATETIME = NULL,
    @EffDtTo SMALLDATETIME = NULL,
    @JournalDetailId INT = 0,
    @JournalDetailIdList XML = NULL
AS 
    SET NOCOUNT ON  

2 个答案:

答案 0 :(得分:1)

更改SqlCommand对象上的CommandTimeout属性 - 默认值为30秒;

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.110).aspx

我认为SSMS中的默认值是没有超时

答案 1 :(得分:0)

很明显,我在几年前从一个项目中找到的这些代码仍然有用。

SqlCommand cmd = new SqlCommand("usp_GetAllAccounts", connection);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
**SqlCommandBuilder.DeriveParameters(cmd);**

然后我可以为for循环中返回的每个参数赋值。我不明白,但这会将我的时间缩短8分钟,缩短到45秒,这与SSMS相当。