2013-02-26 10 views
6

Cóż, używam SQLite, ale kiedy zaczynam wykonywać non queries prawdopodobnie 10k + poleceń [.sql plik]. Uważam, że jest to bardzo powolne, że może zająć do 10 minut, aby zakończyć dodawanie informacji do bazy danych.SQLite Bardzo powolny ExecuteNonQuery

W każdym razie jest to mój kod 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; 
} 

Mam nadzieję, że jest sposób, aby zająć tylko kilka sekund.

+2

Twój problem prawdopodobnie dotyczy Twojego zapytania? – Fox32

+2

Wątpię w to, ponieważ jest bardzo prosty INSERT INTO CMDS ze skryptu .sql –

+1

czy masz je zawinięte w instrukcji begin-commit? –

Odpowiedz

4

Rzeczą z SQLite jest to, że ma polecenie wrap-update-delete-wrap w transakcji, inaczej będzie boleśnie wolno. Możesz to zrobić za pomocą obsługi transakcji wbudowanej w dostawcę danych .NET lub gdy czytasz plik .sql, możesz utworzyć pierwszą linię begin transaction i ostatnią linię . Tak czy inaczej powinno działać.

Jeśli chcesz to zrobić w pliku .sql, może wyglądać tak.

begin transaction; 

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

commit transaction; 

Lub jeśli zrobisz to w kodzie, będzie wyglądać tak.

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

Masz mój kod powyżej, możesz edytować swoją odpowiedź z tym, co wskazujesz. Ponieważ po dodaniu początku transakcji i wierszy komend do pliku .sql otrzymałem błąd SQL Logic –

+0

i dodałem te linie do początku i końca wierszy pliku .sql, ale uważam, że nic nie robi, w przeciwnym razie zapytanie jest teraz zamrożone. –

+0

@RuneS: Hmm ... to dziwne, ponieważ właśnie tak to robię i działa dobrze. Jaki błąd otrzymałeś po raz pierwszy z sqlite? –

Powiązane problemy