2013-10-20 18 views
13

Tôi đang cố gắng sử dụng SQLite làm bộ nhớ của mình. Tôi đã thêm dll tham chiếu bằng cách sử dụng nuget và sử dụng câu lệnh là tốt.Truy vấn chèn đơn giản SQLite

Tôi có

private void SetConnection() 
{ 
      sql_con = new SQLiteConnection 
       ("Data Source=c:\\Dev\\MYApp.sqlite;Version=3;New=False;Compress=True;"); 
} 

private void ExecuteQuery(string txtQuery) 
{ 
      SetConnection(); 
      sql_con.Open(); 
      sql_cmd = sql_con.CreateCommand(); 
      sql_cmd.CommandText = txtQuery; 
      sql_cmd.ExecuteNonQuery(); 
      sql_con.Close(); 
} 

và tôi gửi txt truy vấn như

public void Create(Book book) 
{ 
      string txtSqlQuery = "INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) "; 
      txtSqlQuery += string.Format("VALUES (@{0},@{1},@{2},@{3},@{4},@{5},@{6},@{7},{8})", 
         book.Id, book.Title, book.Language, book.PublicationDate, book.Publisher, book.Edition, book.OfficialUrl, book.Description, book.EBookFormat); 
        try 
        { 
         ExecuteQuery(txtSqlQuery); 
        } 
        catch (Exception ex) 
        { 
         throw new Exception(ex.Message); 
        }  
} 

db của tôi này được tạo ra một cách chính xác và thông qua ví dụ cuốn sách với dữ liệu hợp lệ là ok. Tuy nhiên, ngoại lệ luôn được đưa ra khi thực hiện truy vấn trên dòng mã này:

sql_cmd.ExecuteNonQuery(); 

Tôi rõ ràng đang làm điều gì đó sai ở đây nhưng tôi không thể thấy.

Cập nhật: ném nhắn ngoại lệ là

lỗi SQL logic hoặc thiếu cơ sở dữ liệu

không được công nhận mã thông báo: "22cf"

nơi 22cf này là một phần của truyền book.Id chuỗi guid.

+0

Ngoại lệ nào được ném? – Alireza

+0

@Alireza cập nhật questio – user2783193

+0

Tôi nhận thấy rằng bạn không sử dụng các tham số chính thức cho lệnh SQL của bạn. Điều này không phải là rất nhiều khuyến khích, bởi vì bạn sẽ phải lo lắng về việc trình bày dữ liệu vào một câu lệnh SQL (tức là ngày định dạng, dấu tách thập phân, v.v ...). –

Trả lời

-2

Bạn nên sử dụng (') khi gửi chuỗi vào câu lệnh INSERT GIÁ TRỊ (@ {0},' @ {1} ',' @ {2} ',' @ {3} ',' @ {4} ', '@ {5}', '@ {6}',' @ {7}, {8}) bạn cũng nên bắt SQLExeprion

+0

Câu trả lời tuyệt vời, tôi có lẽ sẽ sử dụng tên params tho như đề xuất ở đây http://stackoverflow.com/questions/809246/adding-parameters-in-sqlite-with-c-sharp Tại sao? bởi vì trong một số câu lệnh sql của tôi, bạn có thể sử dụng cùng một tham số một vài lần khác nhau. – infocyde

41

Don't EVER insert your data in your statement!

Sử dụng báo cáo và các thông số ràng buộc chuẩn bị:

public void Create(Book book) { 
    SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) VALUES (?,?,?,?,?,?,?,?)", sql_con); 
    insertSQL.Parameters.Add(book.Id); 
    insertSQL.Parameters.Add(book.Title); 
    insertSQL.Parameters.Add(book.Language); 
    insertSQL.Parameters.Add(book.PublicationDate); 
    insertSQL.Parameters.Add(book.Publisher); 
    insertSQL.Parameters.Add(book.Edition); 
    insertSQL.Parameters.Add(book.OfficialUrl); 
    insertSQL.Parameters.Add(book.Description); 
    insertSQL.Parameters.Add(book.EBookFormat); 
    try { 
     insertSQL.ExecuteNonQuery(); 
    } 
    catch (Exception ex) { 
     throw new Exception(ex.Message); 
    }  
} 
+0

Ví dụ này không hoạt động nếu tham số không phải là loại chuỗi. –

+1

Không chính xác: [SqlParameterCollection.Add] (https://msdn.microsoft.com/en-us/library/ms136439.aspx) chấp nhận các giá trị đối tượng. Tất nhiên, việc triển khai sẽ chuyển đổi các kiểu .NET thành các kiểu cơ sở dữ liệu thích hợp. Việc thực thi SQLite chấp nhận các kiểu chuỗi mà còn là các kiểu số, null, ... –

+0

Đây là SQLiteParameterCollection.Add(), nhưng bạn đúng - nó chấp nhận Object. Tôi phải có một số sai lầm khi tôi đang thử nghiệm. Trong mọi trường hợp, IntelliSense không hiển thị phiên bản đó của Add() khi bạn nhập dấu ngoặc đơn mở (nó chỉ hiển thị khi bạn nhập. Trước khi Thêm). –

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