2013-10-20 55 views
13

我試圖使用SQLite作爲我的存儲。我已經使用nuget添加了引用dll,並使用了語句。SQLite簡單插入查詢

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

,我發送查詢TXT這樣

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

我的數據庫正確地創建和使用有效數據通過本書的實例就可以了。但總是執行查詢在這行代碼上拋出異常:

sql_cmd.ExecuteNonQuery(); 

我明顯在這裏做錯了什麼,但我看不到。

更新:拋出的異常的消息是

SQL邏輯錯誤或丟失的數據庫

無法識別的標記: 「22cf」

這哪裏是22cf通過book.Id GUID字符串的一部分。

+0

拋出了什麼異常? – Alireza

+0

@Alireza更新了問題 – user2783193

+0

我注意到你沒有使用正式參數到你的SQL命令。這不是很明智,因爲您不得不擔心將數據呈現給SQL語句(即格式化日期,小數點分隔符等)。 –

回答

-2

將字符串發送到INSERT語句時應使用(') VALUES(@ {0},'@ {1}','@ {2}','@ {3}','@ {4} 」, '@ {5}', '@ {6}', '@ {7}',{8}) 你應該也趕上SQLExeprion

+0

偉大的答案,我可能會使用命名參數tho這裏建議http://stackoverflow.com/questions/809246/adding-parameters-in-sqlite-with-c-sharp爲什麼?因爲在我的一些sql語句中,你可能會在幾個不同的時間使用相同的參數。 – infocyde

41

Don't EVER insert your data in your statement!

使用準備語句和綁定參數:

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

如果參數不是字符串類型,則此示例不起作用。 –

+1

這是不正確的:[SqlParameterCollection.Add](https://msdn.microsoft.com/en-us/library/ms136439.aspx)接受對象值。當然,實現會將.NET類型轉換爲適當的數據庫類型。 SQLite實現接受字符串類型,但也接受數字類型,null,... –

+0

這是SQLiteParameterCollection.Add(),但你是對的 - 它接受Object。我在測試時肯定犯了一些錯誤。在任何情況下,一旦您鍵入左括號(僅在您添加前鍵入時顯示它),IntelliSense纔會顯示該版本的Add()。 –