编辑
2025-09-26
C#
00

目录

准备工作
连接到数据库
基本的 DELETE 操作
删除单个记录
删除多个记录
使用参数化查询进行删除
高级 DELETE 操作
使用子查询进行删除
使用事务进行删除
删除表中的所有记录
完整示例
注意事项
结论

本文将详细介绍如何使用 C# 在 SQLite 数据库中执行 DELETE 操作。DELETE 操作用于从数据库中删除记录,是数据库管理中的一个重要且需要谨慎使用的操作。

准备工作

首先,确保你的项目中已安装 System.Data.SQLite NuGet 包。在你的 C# 文件顶部添加以下 using 语句:

C#
using System; using System.Data.SQLite; using System.Collections.Generic;

连接到数据库

在执行任何数据库操作之前,我们需要建立与数据库的连接。以下是一个建立连接的辅助方法:

C#
public static SQLiteConnection ConnectToDatabase(string dbPath) { try { SQLiteConnection connection = new SQLiteConnection($"Data Source={dbPath};Version=3;"); connection.Open(); return connection; } catch (Exception ex) { Console.WriteLine($"连接数据库时出错:{ex.Message}"); return null; } }

基本的 DELETE 操作

删除单个记录

以下是一个基本的删除单个记录的方法:

C#
public static int DeleteRecord(SQLiteConnection connection, string tableName, string whereClause) { try { string sql = $"DELETE FROM {tableName} WHERE {whereClause}"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"成功删除 {rowsAffected} 条记录。"); return rowsAffected; } } catch (Exception ex) { Console.WriteLine($"删除记录时出错:{ex.Message}"); return -1; } }

使用示例:

SQL
DeleteRecord(connection, "Users", "Id = 1");

image.png

删除多个记录

对于需要删除多个记录的情况,我们可以使用相同的方法,但可能需要更复杂的 WHERE 子句:

C#
public static int DeleteMultipleRecords(SQLiteConnection connection, string tableName, string whereClause) { return DeleteRecord(connection, tableName, whereClause); }

使用示例:

PHP
DeleteMultipleRecords(connection, "Users", "LastLoginDate < date('now', '-1 year')");

使用参数化查询进行删除

为了防止 SQL 注入攻击并提高性能,我们应该使用参数化查询:

C#
public static int DeleteRecordParameterized(SQLiteConnection connection, string tableName, string whereClause, Dictionary<string, object> parameters) { try { string sql = $"DELETE FROM {tableName} WHERE {whereClause}"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { foreach (var param in parameters) { command.Parameters.AddWithValue($"@{param.Key}", param.Value); } int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"成功删除 {rowsAffected} 条记录。"); return rowsAffected; } } catch (Exception ex) { Console.WriteLine($"参数化删除记录时出错:{ex.Message}"); return -1; } }

使用示例:

C#
var parameters = new Dictionary<string, object> { { "id", 1 }, { "status", "Inactive" } }; DeleteRecordParameterized(connection, "Users", "Id = @id AND Status = @status", parameters);

高级 DELETE 操作

使用子查询进行删除

SQLite 支持在 DELETE 语句中使用子查询。以下是一个使用子查询的删除方法:

C#
public static int DeleteWithSubquery(SQLiteConnection connection, string tableName, string subquery) { try { string sql = $"DELETE FROM {tableName} WHERE Id IN ({subquery})"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"成功删除 {rowsAffected} 条记录。"); return rowsAffected; } } catch (Exception ex) { Console.WriteLine($"使用子查询删除记录时出错:{ex.Message}"); return -1; } }

使用示例:

C#
string subquery = "SELECT UserId FROM Orders WHERE OrderDate < date('now', '-1 year')"; DeleteWithSubquery(connection, "Users", subquery);

使用事务进行删除

对于需要保证原子性的多个删除操作,我们可以使用事务:

C#
public static bool DeleteWithTransaction(SQLiteConnection connection, List<string> deleteQueries) { using (SQLiteTransaction transaction = connection.BeginTransaction()) { try { foreach (string query in deleteQueries) { using (SQLiteCommand command = new SQLiteCommand(query, connection, transaction)) { command.ExecuteNonQuery(); } } transaction.Commit(); Console.WriteLine("删除事务成功提交。"); return true; } catch (Exception ex) { transaction.Rollback(); Console.WriteLine($"删除事务失败,已回滚。错误:{ex.Message}"); return false; } } }

使用示例:

C#
var queries = new List<string> { "DELETE FROM Orders WHERE UserId = 1", "DELETE FROM Users WHERE Id = 1" }; DeleteWithTransaction(connection, queries);

image.png

删除表中的所有记录

有时候可能需要删除表中的所有记录。虽然可以使用不带 WHERE 子句的 DELETE 语句,但使用 TRUNCATE 通常更快:

C#
public static bool TruncateTable(SQLiteConnection connection, string tableName) { try { string sql = $"DELETE FROM {tableName}"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { command.ExecuteNonQuery(); } // 重置自增列(如果有的话) sql = $"DELETE FROM sqlite_sequence WHERE name = '{tableName}'"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { command.ExecuteNonQuery(); } Console.WriteLine($"成功清空表 {tableName}。"); return true; } catch (Exception ex) { Console.WriteLine($"清空表时出错:{ex.Message}"); return false; } }

使用示例:

SQL
TruncateTable(connection, "Orders");

完整示例

以下是一个完整的示例,展示了如何使用上述所有方法:

C#
using System; using System.Collections.Generic; using System.Data.SQLite; class Program { static void Main(string[] args) { string dbPath = "C:\\example.db"; SQLiteConnection connection = ConnectToDatabase(dbPath); if (connection != null) { // 删除单个记录 DeleteRecord(connection, "Users", "Id = 1"); // 删除多个记录 DeleteMultipleRecords(connection, "Users", "LastLoginDate < date('now', '-1 year')"); // 参数化删除 var parameters = new Dictionary<string, object> { { "id", 2 }, { "status", "Inactive" } }; DeleteRecordParameterized(connection, "Users", "Id = @id AND Status = @status", parameters); // 使用子查询删除 string subquery = "SELECT UserId FROM Orders WHERE OrderDate < date('now', '-1 year')"; DeleteWithSubquery(connection, "Users", subquery); // 使用事务删除 var queries = new List<string> { "DELETE FROM Orders WHERE UserId = 3", "DELETE FROM Users WHERE Id = 3" }; DeleteWithTransaction(connection, queries); // 清空表 TruncateTable(connection, "Orders"); // 关闭连接 connection.Close(); } } // 在这里实现所有上述方法 }

注意事项

  1. 始终使用参数化查询来防止 SQL 注入攻击。
  2. 在删除数据之前,最好先使用 SELECT 语句确认要删除的记录。
  3. 删除操作是不可逆的,所以在执行删除操作之前,确保有适当的备份策略。
  4. 对于大量数据的删除,考虑使用事务来提高性能并确保数据一致性。
  5. 如果需要删除表中的所有数据,使用 TRUNCATE(在 SQLite 中通过 DELETE FROM 实现)通常比 DELETE 不带 WHERE 子句更快。
  6. 在完成操作后,记得关闭数据库连接。
  7. 对于涉及外键的删除操作,要特别小心,确保不会破坏数据完整性。

结论

本文详细介绍了如何使用 C# 在 SQLite 数据库中执行各种 DELETE 操作,包括基本删除、参数化删除、使用子查询的删除、使用事务的删除以及清空表。这些操作覆盖了大多数常见的数据删除场景。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!