问题描述
我遇到了一个奇怪的问题,我似乎无法找到答案...
我有一段代码,它使用事务和参数将数据插入到 sqlite 数据库中。它从传递的对象 List<T>
列表中获取值。一共有74个参数……我的代码是这样的
dbConnection.open();
using (sqliteTransaction transaction = dbConnection.BeginTransaction())
{
foreach (CardScryfall _card in _cards)
{
sqliteCommand com = dbConnection.CreateCommand();
com.CommandText = sql;
com.Parameters.Add("@dbid",sqliteType.Integer); //Mandatory
//Assign values to Parameters
com.Parameters[0].Value = GetNextDBID();
//Assign card properties to parameters
com.Parameters.Add("@objectName",sqliteType.Text);
com.Parameters[com.Parameters.IndexOf("@objectName")].Value = _card.objectName;
//Next 72 parameters are created the same way.
//Replace NULL with dbnull.Value
foreach (sqliteParameter par in com.Parameters)
{
if (par.Value == null)
{
par.Value = dbnull.Value;
}
}
//Execute query
com.Prepare();
com.ExecuteNonQuery();
transaction.Commit();
com.dispose();
}
}
dbConnection.Close();
现在...当我删除 using transaction
部分时,代码工作正常,但速度非常慢...
所以我补充说想把它包装成一个事务以提高性能。
现在的问题是在添加参数中间的某个地方(每次我单步执行代码时都不同)dbconnection.State
从打开变为关闭所以当代码到达 com.Prepare()
以进行第一次插入和我收到连接已关闭的错误...我有 10k+ 条记录要插入
我尝试设置 dbConnection.DefaultTimeout = 0
但没有帮助...
你能帮忙吗???
谢谢
更新:
我发现了我的问题...
函数 GetNextDBID()
正在检索打开和关闭 DBconnection 的最后一个 recordID ......所以我改变了代码,现在它工作正常
解决方法
无需在循环中创建命令。您应该创建一次,然后只为参数分配新值。
同样,您不需要在循环的每次迭代中提交事务。最后做一次。
async dragAndDrop(dragElement: WebElement,dropElement: WebElement) {
await browser.actions().mouseMove(dragElement).perform();
await browser.actions().mouseDown(dragElement).perform();
await browser.actions().mouseMove({ x: 10,y: 0 }).perform();
await browser.actions().mouseMove(dropElement).perform();
await browser.actions().mouseUp().perform();
}