我正在使用SqlConnection类并遇到命令超时到期的问题.首先,我使用SqlCommand属性来设置命令超时,如下所示:command.CommandTimeout = 300;此外,我已确保将执行超时设置设置为0,以确保SQL管理方面不会有超时.这是我...
我正在使用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条记录.
我将证明任何帮助我解决这个问题的个人是最高级的伟大巫师.
解决方法:
我相信发生的事情是你有一个死锁情况导致你在InsertCourseLookupRecord()函数中的查询失败.您没有将连接传递给InsertCourseLookupRecord(),所以我假设您在单独的连接中运行它.那么会发生什么:
>您开始了一项交易.
>你截断表.
> InsertCourseLookupRecord启动另一个连接并尝试插入
数据进入该表,但表被锁定,因为你的
交易尚未提交.
>函数InsertCourseLookupRecord()中的连接在为该连接定义的超时值超时30秒时超时.
您可以更改函数以接受命令对象作为参数,并在函数内部使用它而不是创建新连接.这将成为交易的一部分,并将全部一起提交.
要执行此操作,请将函数定义更改为:
public static int InsertCourseLookupRecord(string course, SqlCommand cmd)
从函数中取出所有连接代码,因为您将使用cmd对象.然后,当您准备好执行查询时:
myCommand.Parameters.Clear(); //need only if you're using command parameters
cmd.CommandText = "INSERT BLAH BLAH BLAH";
cmd.ExecuteNonQuery();
它将在相同的连接和事务上下文中运行.
你在你的使用块中这样称呼它:
CourseHelper.InsertCourseLookupRecord(course, command);
您也可以只使用InsertCourseLookupRecord中的代码并将其放在for循环中,然后在using块中重用命令对象,而无需将其传递给函数.
本文标题为:c# – SQL Timeout在不应该的时候过期
基础教程推荐
- C#winform中数据库绑定DataGrid的实现 2023-06-08
- C#中多种高效定时器方法的使用详解 2023-07-18
- Unity实现瞄准镜效果 2023-04-15
- UnityShader3实现彩光效果 2023-01-16
- C#监测IPv4v6网速及流量的实例代码 2023-03-04
- vscode设置Fira_Code字体及改变编辑器字体、背景颜色的代码详解 2023-03-09
- Unity中的静态批处理和动态批处理操作 2023-04-10
- Centos7下Supervisor和Jexus两种方式部署.NETCore3.1项目 2023-09-26
- dotnet core链接mongodb代码实例 2023-02-03
- Unity2023发布WebGL与网页交互问题的解决 2023-06-08