SQlite 连接在执行前自行关闭

问题描述

我遇到了一个奇怪的问题,我似乎无法找到答案...

我有一段代码,它使用事务和参数将数据插入到 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();
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...