【发布时间】:2015-11-07 00:55:57
【问题描述】:
我正在使用 SqlConnection 类并遇到命令超时到期的问题。
首先,我使用 SqlCommand 属性来设置命令超时,如下所示:
command.CommandTimeout = 300;
此外,我已确保将执行超时设置设置为 0,以确保 SQL 管理方面不存在超时。
这是我的代码:
using (SqlConnection conn = new SqlConnection(connection))
{
conn.Open();
SqlCommand command = conn.CreateCommand();
var transaction = conn.BeginTransaction("CourseLookupTransaction");
command.Connection = conn;
command.Transaction = transaction;
command.CommandTimeout = 300;
try
{
command.CommandText = "TRUNCATE TABLE courses";
command.ExecuteNonQuery();
List<Course> courses = CourseHelper.GetAllCourses();
foreach (Course course in courses)
{
CourseHelper.InsertCourseLookupRecord(course);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Log.Error(string.Format("Unable to reload course lookup table: {0}", ex.Message));
}
}
我已设置日志记录,并且可以在触发此功能后 30 秒准确验证,我在堆栈跟踪中收到以下错误消息:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
为了全面披露: 在上述 using 语句 foreach 中发现的 InsertCourseLookupRecord() 正在对同一个数据库中的同一个表执行另一个查询。这是它正在执行的查询:
INSERT INTO courses(courseid, contentid, name, code, description, url, metakeywords, metadescription)
VALUES(@courseid, @contentid, @name, @code, @description, @url, @metakeywords, @metadescription)"
此表中有超过 1400 条记录。
我将证明任何帮助我解决此问题的个人都是至高无上的大巫师。
【问题讨论】:
-
CommandTimeout仅适用于command对象。对InsertCourseLookupRecord的调用不会继承command的300 秒超时。我怀疑您的TRUNCATE TABLE命令导致超时。您能否验证该表是否实际被截断? -
我也怀疑它的
TRUNCATE查询,我应该考虑为在 InsertCourseLookupRecord 中完成的INSERT查询设置超时...因为我正在回滚catch中的事务,所以我无法验证截断是否确实有效。
标签: c# sql asp.net sql-server sql-server-2008