2014-06-12 18 views
8

Trong quá khứ, tôi đã tránh ORM và luôn luôn truy vấn thủ công tham số hóa vv Điều này rất tốn thời gian và một nỗi đau thực sự khi lần đầu tiên phát triển một ứng dụng. Gần đây tôi quyết định có một cái nhìn khác về ORM đặc biệt là Sqlite.NET ORM.Làm thế nào để bạn chạy một loạt câu lệnh SQL bằng cách sử dụng SQLite.NET PCL

Tôi muốn sử dụng các tính năng ORM của SQLite nhưng cũng có thể chạy một loạt các lệnh SQL nguyên gốc để chuẩn bị sẵn một cơ sở dữ liệu.

Chúng tôi đang sử dụng SqliteNetExtensions-MvvmCross dll để cho phép các mối quan hệ một-nhiều-v.v ... và tất cả đều ổn. Các vấn đề của tôi xuất hiện khi tôi muốn tạo cơ sở dữ liệu với dữ liệu cấu hình. Tôi đã hy vọng chỉ đơn giản là cung cấp một tập tin sql có chứa một loạt các báo cáo sql rằng nó sẽ chạy cái khác.

Tôi đã lấy mã SQlite.NET từ GITHub và chạy thử nghiệm. Tôi đã sau đó mở rộng các lớp StringQueryTests mà có một đơn giản [sản phẩm] bảng để làm như sau: -

 [Test] 
    public void AlanTest() 
    { 
     StringBuilder sb = new StringBuilder(200); 
     sb.Append(" DELETE FROM Product;"); 
     sb.Append(" INSERT INTO Product VALUES (1,\"Name1\",1,1);"); 
     sb.Append(" INSERT INTO Product VALUES (2,\"Name2\",2,3);"); 
     db.Execute(sb.ToString()); 
    } 

Khi tôi chạy này nó không ném ra một lỗi và trong thực tế hành vi có vẻ là rằng nó sẽ chỉ chạy lệnh đầu tiên. Nếu tôi dán nội dung của sb.ToString() vào cửa sổ truy vấn cơ sở dữ liệu sqlite, nó sẽ hoạt động tốt.

Đây có phải là hành vi mong đợi không? Nếu vậy, làm thế nào để tôi đi về việc khắc phục điều này để tôi có thể sử dụng một cách tiếp cận như trên. Tôi không thực sự muốn tạo các đối tượng để quản lý tất cả các câu lệnh SQL nếu có thể.

Tôi có thể thấy rằng có một số cách tiếp cận có thể được áp dụng để khắc phục sự cố này - bất kỳ ai có công việc xung quanh hoặc đề xuất họ nghĩ có thể giải quyết vấn đề này?

Trân trọng

Alan.

+0

[Báo cáo lỗi không hoạt động] (https: // github.com/oysteinkrog/SQLite.Net-PCL/issues/362) –

Trả lời

1

Tôi chỉ chạy vào vấn đề này quá. I found a blog post that explains why.

Đây là nội dung bài đăng đề cập trong trường hợp bài đăng bị thiếu.

Tất cả mã trong [sqlite-net] kiểm tra chính xác mã kết quả và ném ngoại lệ tương ứng.

Mặc dù tôi chưa đăng tất cả các mã có liên quan ở đây, tôi đã đánh giá nó và nguồn gốc thực sự của hành vi này là ở nơi khác - trong phương pháp sqlite3_prepare_v2 sqlite3.dll gốc. Đây là phần liên quan của tài liệu:

Các thường trình này chỉ biên dịch câu lệnh đầu tiên trong zSql, vì vậy * pzTail được trỏ sang trái với những gì vẫn chưa được biên dịch. Vì sqlite-net không làm bất cứ điều gì với đuôi chưa được biên dịch, chỉ có câu lệnh đầu tiên trong lệnh được thực thi. Phần còn lại được bỏ qua âm thầm. Trong hầu hết các trường hợp, bạn sẽ không nhận thấy rằng khi sử dụng sqlite-net. Bạn sẽ sử dụng lớp ORM vi mô của nó hoặc thực thi các câu lệnh riêng lẻ. Ngoại lệ chung duy nhất xuất hiện trong đầu, là cố gắng thực thi DDL hoặc các kịch bản di chuyển thường là các lô lệnh đa.

3

bạn không thể làm:

[Test] 
    public void AlanTest() 
    { 
     var queries = new List<string>() 
     { 
      " DELETE FROM Product", 
      " INSERT INTO Product VALUES (1,\"Name1\",1,1)", 
      " INSERT INTO Product VALUES (2,\"Name2\",2,3)" 
     }; 

     db.BeginTransaction(); 
     queries.ForEach (query => db.Execute (query)); 
     db.Commit(); 
    } 

Bạn không thực sự cần giao dịch, chỉ nhanh hơn thực hiện/trạm kiểm soát rollback ...

+0

Tôi thích sử dụng giao dịch để cải thiện hiệu suất :-) – MStack

Các vấn đề liên quan