2013-02-26 31 views
6

Tôi đang sử dụng SQLite nhưng khi tôi bắt đầu thực hiện các truy vấn không phải là 10k + lệnh [.sql file]. Tôi thấy rằng nó rất chậm mà nó có thể mất tới 10 phút + để kết thúc việc thêm thông tin vào cơ sở dữ liệu.SQLite Rất chậm ExecuteNonQuery

Dù sao đây là mã ExecuteNonQuery của tôi.

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; 
} 

Tôi hy vọng có một cách để chỉ mất vài giây để hoàn thành.

+2

Có thể sự cố của bạn có trong truy vấn của bạn? – Fox32

+2

Tôi nghi ngờ rằng vì nó rất đơn giản INSERT INTO CMDS từ một tập lệnh .sql –

+1

bạn có đưa chúng vào câu lệnh bắt đầu cam kết không? –

Trả lời

4

Điều với SQLite là bạn bỏ các lệnh chèn-cập nhật-xóa trong một giao dịch nếu không nó sẽ chậm một cách đau đớn. Bạn có thể làm điều này với sự hỗ trợ giao dịch được tích hợp vào Trình cung cấp dữ liệu .NET hoặc vì bạn đang đọc tệp .sql bạn có thể tạo dòng đầu tiên begin transaction và dòng cuối cùng commit transaction. Dù bằng cách nào cũng có tác dụng.

Nếu bạn muốn làm điều đó trong tệp .sql thì có thể nó sẽ trông như thế này.

begin transaction; 

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

commit transaction; 

Hoặc nếu bạn làm điều đó trong mã, nó sẽ trông như thế này.

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

Bạn có mã của tôi ở trên có thể bạn chỉnh sửa câu trả lời của bạn với những gì bạn đang trỏ đến. Bởi vì khi tôi thêm vào giao dịch bắt đầu và dòng comit vào tệp .sql tôi đã nhận lỗi SQL Logic –

+0

tôi đã thêm các dòng đó vào đầu và dòng kết thúc của tệp .sql nhưng tôi thấy rằng nó không làm bất cứ điều gì, ngược lại truy vấn hiện đang bị đóng băng. –

+0

@RuneS: Hmm ... thật kỳ lạ vì đó chính là cách tôi làm điều đó và nó hoạt động tốt. Lỗi bạn đã nhận được từ sqlite lần đầu tiên là gì? –