在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()之后它会丢失更改的假设是不正确的。它肯定找到了新插入的行并将其输出到控制台。但是,在我停止应用程序之后,表和行仍然会消失。