无法使用 c# 函数从 SQL table 中删除一行
can't delete a row from a SQL table with c# function
我有一个函数可以从 SQLite 数据库的 table 中删除行。函数不会抛出异常或崩溃,但也无法删除任何内容。 "cmd_1.ExecuteNonQuery()" returns 零,但我要删除的行存在。我在这里做错了什么?
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();
}
扩展 Haldo 所说的话;永远不要用单引号将标识符(table 名称、列名称)括起来。 SQLite 确实支持它,因为如果您在需要标识符的地方使用它,您不会收到投诉,但在 SQL 中,单引号用于表示字符串。我认为您的 where 子句很可能被视为 WHERE 'a' = 'b'
并且“字符串 a 等于字符串 b”始终为假。
看到这个fiddle:https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=3b8c9364bedb03138403fa741485779a
第一个查询选择一个结果,第二个没有
如果您处于“为什么我的数据库没有更改?”的情况下需要考虑的其他事项场景
SQLite 是一个基于文件的数据库。您绝对确定您正在查看您的代码正在更改的同一个数据库文件吗?如果每次开发人员使用基于文件的数据库时我都有一美元,在 c:\temp\my.db 中查看数据库并继续“为什么我看不到更改?”没有意识到程序正在编辑 c:\repos\myproject\bin\debug\my.db 中的文件我会退休
另一件事;您绝对确定您引用的 ID 确实存在于数据库中吗?很多次我已经 运行 删除,然后再次 运行 相同的删除,但是第二次没有任何东西可以删除,所以 table 行数没有改变。 .
最后,正如一些人评论的那样,不要像您所做的那样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();
}
永远、永远不要允许用户为 table 名称或列名称提供数据;他们可能只为 pKeyValue 提供一个值,例如从网页的下拉列表中选择要删除的记录。如果您将来改用 SQLServer 数据库,avoid AddWithValue
看起来您实际上是在尝试编写一些东西来让您的数据库生活更轻松;您是否考虑过学习 Entity Framework?
我有一个函数可以从 SQLite 数据库的 table 中删除行。函数不会抛出异常或崩溃,但也无法删除任何内容。 "cmd_1.ExecuteNonQuery()" returns 零,但我要删除的行存在。我在这里做错了什么?
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();
}
扩展 Haldo 所说的话;永远不要用单引号将标识符(table 名称、列名称)括起来。 SQLite 确实支持它,因为如果您在需要标识符的地方使用它,您不会收到投诉,但在 SQL 中,单引号用于表示字符串。我认为您的 where 子句很可能被视为 WHERE 'a' = 'b'
并且“字符串 a 等于字符串 b”始终为假。
看到这个fiddle:https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=3b8c9364bedb03138403fa741485779a
第一个查询选择一个结果,第二个没有
如果您处于“为什么我的数据库没有更改?”的情况下需要考虑的其他事项场景
SQLite 是一个基于文件的数据库。您绝对确定您正在查看您的代码正在更改的同一个数据库文件吗?如果每次开发人员使用基于文件的数据库时我都有一美元,在 c:\temp\my.db 中查看数据库并继续“为什么我看不到更改?”没有意识到程序正在编辑 c:\repos\myproject\bin\debug\my.db 中的文件我会退休
另一件事;您绝对确定您引用的 ID 确实存在于数据库中吗?很多次我已经 运行 删除,然后再次 运行 相同的删除,但是第二次没有任何东西可以删除,所以 table 行数没有改变。 .
最后,正如一些人评论的那样,不要像您所做的那样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();
}
永远、永远不要允许用户为 table 名称或列名称提供数据;他们可能只为 pKeyValue 提供一个值,例如从网页的下拉列表中选择要删除的记录。如果您将来改用 SQLServer 数据库,avoid AddWithValue
看起来您实际上是在尝试编写一些东西来让您的数据库生活更轻松;您是否考虑过学习 Entity Framework?