我有一個函式可以從 SQLite 資料庫中的表中洗掉行。函式不會拋出例外或崩潰,但它也無法洗掉任何內容。“cmd_1.ExecuteNonQuery()”回傳零,但我試圖洗掉的行存在。我在這里做錯了什么?
public void deleteEntryInTable(string tableName, string pKeyName, string pKeyValue)
{
conDB.Open();
cmd_1 = conDB.CreateCommand();
cmd_1.CommandText = $"DELETE FROM '{tableName}' WHERE '{pKeyName}'='{pKeyValue}'";
System.Diagnostics.Debug.WriteLine(cmd_1.CommandText);
try
{
int rows = cmd_1.ExecuteNonQuery();
System.Diagnostics.Debug.WriteLine(rows.ToString());
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
conDB.Close();
}
uj5u.com熱心網友回復:
擴展哈爾多所說的;永遠不要用單引號括起識別符號(表名、列名)。SQLite 確實支持它,因為如果您在需要識別符號的地方使用它,您不會收到投訴,但在 SQL 中,單引號用于表示字串。我認為您的 where 子句很可能被視為WHERE 'a' = 'b'“字串 a 等于字串 b”總是錯誤的。
看到這個小提琴:https ://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=3b8c9364bedb03138403fa741485779a
第一個查詢選擇一個結果,第二個沒有
如果您處于“為什么我的資料庫沒有改變?”的情況下需要考慮的其他事項。設想
SQLite 是一個基于檔案的資料庫。你確定你正在查看你的代碼正在改變的同一個資料庫檔案嗎?如果開發人員每次使用基于檔案的資料庫時我都有一美元,請查看 c:\temp\my.db 中的資料庫并“為什么我看不到更改??” 沒有意識到程式正在編輯 c:\repos\myproject\bin\debug\my.db 中的檔案我會退休
另一件事;您絕對確定您參考的 id 確實存在于資料庫中嗎?很多次我運行洗掉,然后再次運行相同的洗掉,但第二輪沒有什么可洗掉的,所以表行數不會改變..
最后,正如一些人所評論的,不要像以前那樣撰寫 SQL。喜歡這樣的形式:
public void DeleteEntryInTable(string tableName, string pKeyName, string pKeyValue)
{
conDB.Open();
cmd_1 = conDB.CreateCommand();
cmd_1.CommandText = $"DELETE FROM {tableName} WHERE {pKeyName} = @pKeyValue";
cmd_1.Parameters.AddWithValue("@pKeyValue", pKeyValue);
System.Diagnostics.Debug.WriteLine(cmd_1.CommandText);
try
{
int rows = cmd_1.ExecuteNonQuery();
System.Diagnostics.Debug.WriteLine(rows.ToString());
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
conDB.Close();
}
永遠不要允許用戶為表名或列名提供資料;他們可能只為 pKeyValue 提供一個值,例如從網頁的下拉串列中選擇要洗掉的記錄。如果您將來切換到使用 SQLServer db,請避免使用 AddWithValue
實際上,您似乎正在嘗試撰寫一些東西來使您的資料庫生活更輕松;您是否考慮過學習物體框架之類的東西?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415705.html
標籤:
上一篇:如何在Swift中從sockaddr_in獲取sockaddr?
下一篇:資料庫未在燒瓶專案中初始化
