2013-02-26 196 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