代码之家  ›  专栏  ›  技术社区  ›  Byron Sommardahl

对SQLite的更改在connection.Close()之后丢失

  •  2
  • Byron Sommardahl  · 技术社区  · 14 年前

    在MacOSX上使用MonoTouch.NET for iPhone和SQLite。我能从数据库里读出来没问题。但是,当我尝试对数据库进行更改时,会出现奇怪的行为。下面的代码毫无例外地运行,但是没有对数据库进行任何真正的更改。我可以创建一个表,插入一条记录,选择该记录,然后在控制台中显示它。但是,当我关闭db连接时,所有这些更改都消失了。此外,如果我在conn.Close()之前的代码中放置一个断点并检查数据库,则该表不存在。听起来我只是在处理一个虚构的数据库,它响应实际的SQL语句。奇怪的。

    此代码运行,但实际上不向数据库写入任何内容:

    const string _connectionString = "Data Source=App_Data/MyDatabaseFile";
    
    var conn = new SqliteConnection(_connectionString);
    conn.Open();
    
    var command = conn.CreateCommand();
    
    command.CommandText = "CREATE TABLE Test (id integer primary key AUTOINCREMENT, text varchar(100))";
    command.ExecuteNonQuery();
    
    var cmd2 = conn.CreateCommand();
    cmd2.CommandText = "INSERT INTO Test (Text) Values ('test test test')";
    var rowsAffected = cmd2.ExecuteNonQuery(); //rowsAffected is 1
    
    var cmd3 = conn.CreateCommand();
    cmd3.CommandText = "SELECT * FROM Test";
    var reader = cmd3.ExecuteReader();
    Console.WriteLine(reader["text"]); //writes "test test test" to console, nothing in database
    
    conn.Close();
    

    CREATE TABLE Test (id integer primary key AUTOINCREMENT, text varchar(100));
    INSERT INTO Test (Text) Values ('test test test');
    SELECT * FROM Test;
    

    ... 产生{id=1,text='test'}

    你可能知道,但值得一提的是,我没有使用事务。

    更新:

    有趣。。。我可以将上面运行SELECT查询的代码更改为在“Test2”(不存在的表)中查找,它抛出一个SQLiteException:“No-such-table:Test2”。

    我还尝试将上述代码包装到事务中,以防SQLite需要事务。。。没有骰子。

    更新#2:

    Adam建议尝试打开一个新连接,并在停止应用程序之前再次从新表中进行选择。我在上述代码之后添加了以下代码:

    var conn2 = new SqliteConnection(_connectionString);
    conn2.Open();
    var cmd4 = conn2.CreateCommand();
    cmd4.CommandText = "SELECT * FROM Test";
    var reader2 = cmd4.ExecuteReader();
    Console.WriteLine("2nd attempt: " + reader2["text"]); //outputs correctly
    conn.Close();
    

    好吧,我关于connection.Close()之后它会丢失更改的假设是不正确的。它肯定找到了新插入的行并将其输出到控制台。但是,在我停止应用程序之后,表和行仍然会消失。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Byron Sommardahl    14 年前

    对于任何处理同一问题的人,我想我会继续发表我的发现。我在最初的帖子中描述的行为主要是出于设计。更清楚地说,这里有一个更好的解释: