2013-02-26 118 views
6

嗯,我使用的SQLite,但是当我开始执行非查询可能10k +命令[.sql文件]。我发现它很慢可能需要10分钟才能结束将信息添加到数据库。SQLite非常慢ExecuteNonQuery

无论如何,这是我的ExecuteNonQuery代码。

public int ExecuteNonQuery(string sql) 
{ 
    var cnn = new SQLiteConnection(_dbConnection); 
    cnn.Open(); 
    var mycommand = new SQLiteCommand(cnn) {CommandText = sql}; 
    int rowsUpdated = mycommand.ExecuteNonQuery(); 
    cnn.Close(); 
    return rowsUpdated; 
} 

我希望有一种方法可以在几秒内完成。

+2

可能是您的问题在您的查询中? – Fox32 2013-02-26 21:22:26

+2

我怀疑这是因为它非常简单从一个.sql脚本中插入CMDS – 2013-02-26 21:23:18

+1

你有没有将它们包装在begin-commit语句中? – 2013-02-26 21:24:04

回答

4

SQLite的事情是,你在事务中换行insert-update-delete命令,否则它会很痛苦地慢。您可以使用.NET数据提供程序中内置的事务支持来执行此操作,或者您正在读取.sql文件,您可以使第一行begin transaction和最后一行commit transaction。无论哪种方式应该工作。

如果你想在.sql文件中做它,它可能看起来像这样。

begin transaction; 

insert into ...; 
update ...; 
delete ...; 

commit transaction; 

或者,如果你在代码中它会看起来像这样。

public int ExecuteNonQuery(string sql) 
{ 
    var cnn = new SQLiteConnection(_dbConnection); 
    cnn.Open(); 
    var transaction = cnn.BeginTransaction(); 
    var mycommand = new SQLiteCommand(cnn) {CommandText = sql}; 
    mycommand.Transaction = transaction; 
    int rowsUpdated = mycommand.ExecuteNonQuery(); 
    transaction.Commit(); 
    cnn.Close(); 
    return rowsUpdated; 
} 
+0

你有我的代码以上你可以编辑你的答案与你指向。因为当我添加开始事务和comit行到.sql文件我得到SQL逻辑错误 – 2013-02-26 21:27:55

+0

我将这些行添加到.sql文件的开始和结束行,但我发现它不会做任何事情,否则查询现在被冻结。 – 2013-02-26 21:31:34

+0

@RuneS:嗯......这很奇怪,因为那正是我如何做的,它工作正常。第一次从sqlite返回的错误是什么? – 2013-02-26 21:34:44