C# 在C中使用SQLite锁定数据库
当ExecuteOnQuery时,我的数据库被锁定,但如果我对该部分进行注释,ExecuteReader工作正常。如何避免数据库被锁定?我知道第一次是在创建索引时写入数据库,第二次是读取,但在某些情况下,下面的代码可以正常工作。我需要创建索引以提高速度。有许多函数是通过这种方式创建的,用于从数据库(一个.rdb文件)中获取数据,有些函数有时无法工作C# 在C中使用SQLite锁定数据库,c#,winforms,sqlite,C#,Winforms,Sqlite,当ExecuteOnQuery时,我的数据库被锁定,但如果我对该部分进行注释,ExecuteReader工作正常。如何避免数据库被锁定?我知道第一次是在创建索引时写入数据库,第二次是读取,但在某些情况下,下面的代码可以正常工作。我需要创建索引以提高速度。有许多函数是通过这种方式创建的,用于从数据库(一个.rdb文件)中获取数据,有些函数有时无法工作 List<TargetedOutputRDB1> entityList = new List<TargetedOutputRDB1
List<TargetedOutputRDB1> entityList = new List<TargetedOutputRDB1>();
//
DbDataReader reader = null;
SimulationRDB1 simulation = (SimulationRDB1)crash.Simulation;
DbConnection dbConnection = ((RDB1Connection)crash.DbConnection).DbProviderFactory.CreateConnection();
dbConnection.ConnectionString = crash.DbConnection.ConnectionString;
bool connectionWasClosed = (dbConnection.State == ConnectionState.Closed);
//
try
{
DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.Transaction = (((RDB1Connection)simulation.DbConnection).DbTransaction != null && ((RDB1Connection)simulation.DbConnection).DbTransaction.Connection == simulation.DbConnection ? ((RDB1Connection)simulation.DbConnection).DbTransaction : null); //must be set!
//
if (dbConnection.State == ConnectionState.Closed)
dbConnection.Open();
//
dbCommand.CommandText = string.Format("CREATE INDEX IF NOT EXISTS TOIndexSC ON TargetedOutputs (SimulationId, CrashId)");
dbCommand.ExecuteNonQuery();
dbCommand.CommandText = string.Format("SELECT * FROM TargetedOutputs WHERE SimulationId={0} AND CrashId={1}", ((SimulationRDB1)crash.Simulation).ID, crash.ID);
reader = dbCommand.ExecuteReader();
//
while (reader.Read())
{
long id = (long)reader["Id"];
TargetedOutputRDB1 entity = new TargetedOutputRDB1(simulation, id, reader, false);
entityList.Add(entity);
}
//
return entityList.ToArray();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (reader != null)
reader.Close();
//
if (connectionWasClosed)
dbConnection.Close();
//dbConnection.Dispose();
}
被锁定意味着在x时间内无法访问该表吗?这是Sql的预期行为,因为它需要先完成索引映射,然后才允许您从索引中读取。如果表包含大量数据,或者它是一个复杂的索引(如长varchar),则可能需要一段时间才能完成索引。锁定意味着在执行ExecuteOnQuery语句并等待一段时间后,如果我尝试捕获该语句,则可以看到错误,数据库被锁定。@ȘtefanBlaga你认为你能提供一个数据库模式的小例子来帮助在本地重现问题吗?哦,一个实际的锁定错误。这意味着sqllite服务器正在等待另一个连接完成它的工作,尽管该连接可能早就死了。看看这个问题如何解决:这帮我锁定了你的意思是在x时间内无法访问该表吗?这是Sql的预期行为,因为它需要先完成索引映射,然后才允许您从索引中读取。如果表包含大量数据,或者它是一个复杂的索引(如长varchar),则可能需要一段时间才能完成索引。锁定意味着在执行ExecuteOnQuery语句并等待一段时间后,如果我尝试捕获该语句,则可以看到错误,数据库被锁定。@ȘtefanBlaga你认为你能提供一个数据库模式的小例子来帮助在本地重现问题吗?哦,一个实际的锁定错误。这意味着sqllite服务器正在等待另一个连接完成它的工作,尽管该连接可能早就死了。看看这个问题如何解决:这对我有帮助