Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用SQLite锁定数据库_C#_Winforms_Sqlite - Fatal编程技术网

C# 在C中使用SQLite锁定数据库

C# 在C中使用SQLite锁定数据库,c#,winforms,sqlite,C#,Winforms,Sqlite,当ExecuteOnQuery时,我的数据库被锁定,但如果我对该部分进行注释,ExecuteReader工作正常。如何避免数据库被锁定?我知道第一次是在创建索引时写入数据库,第二次是读取,但在某些情况下,下面的代码可以正常工作。我需要创建索引以提高速度。有许多函数是通过这种方式创建的,用于从数据库(一个.rdb文件)中获取数据,有些函数有时无法工作 List<TargetedOutputRDB1> entityList = new List<TargetedOutputRDB1

当ExecuteOnQuery时,我的数据库被锁定,但如果我对该部分进行注释,ExecuteReader工作正常。如何避免数据库被锁定?我知道第一次是在创建索引时写入数据库,第二次是读取,但在某些情况下,下面的代码可以正常工作。我需要创建索引以提高速度。有许多函数是通过这种方式创建的,用于从数据库(一个.rdb文件)中获取数据,有些函数有时无法工作

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服务器正在等待另一个连接完成它的工作,尽管该连接可能早就死了。看看这个问题如何解决:这对我有帮助