我有一个插入方法,对于较小的数据集可以正常工作,但一旦数据集超过一定大小,无论我在初始事务范围中设置什么,该方法都会超时。
代码中的插入方法使用简单的存储SQL过程,并使用“ExecuteNonQuery”进行调用。
我的代码大致如下(已删除冗余内容):
public void method()
{
using (TransactionScope testScope = new TransactionScope(TransactionScopeOption.Required, new System.TimeSpan(1, 25, 0)))
{
timeDB.insert(var.time);
codeDB.insert(var.code);
foreach (variable var in listOfVariables)
{
nameDB.insert(var.value);
}
testScope.Complete();
}
}
我认为该问题与命令超时有关,而不是范围超时,因为代码在较小的数据集上运行良好... 如果是这种情况,是否有任何方法可以更改命令超时而不修改machine.config(或任何其他.config文件,我被严格禁止修改它们,因为更改值会破坏程序的其余部分)。
如果问题不是特定的命令超时,那是什么导致了这个问题?就像我说的,代码在8000-15000个插入之间运行良好(取决于我们程序配置文件中设置的连接超时值,我只能为测试目的进行修改,但不能更改其中的任何值),但大于此数量后程序就崩溃了。
我确定这绝对不是范围超时值,因为任务在几分钟后超时,远未达到事务范围设置的1小时25分钟。
非常感谢您花时间帮助我解决这个问题。
编辑:
按照要求,我添加了一个insert方法的示例,最终由nameDB.insert方法调用(删除了冗余内容,请注意实际插入方法实际上是NameDB.insert方法的子方法,并且实际循环在nameDB.insert方法中。我只是使用NameDB....等来减少冗余。)
public Int32 Insert(Hashtable serData, DataDO data)
{
int numAffected = 0;
IDataParameter[] parameters =
{
this.Helper.GetParameter("@Text", data.Text),
this.Helper.GetParameter("@CreationDt", ((data.CreationDate == DateTime.MinValue)
? Convert.DBNull : data.CreationDate)),
this.Helper.GetParameter("@TypeId", data.TypeId),
this.Helper.GetParameter("@KeyId", DbType.Int32, 4, ParameterDirection.Output)
};
numAffected = this.Helper.ExecuteNonQuery(this.ConnectionString, "InsertData", parameters);
if (numAffected > 0)
return Convert.ToInt32(parameters[parameters.Length - 1].Value);
return 0;
}