编辑
2025-09-26
C#
00

目录

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

本文将详细介绍如何使用 C# 在 SQLite 数据库中执行 UPDATE 操作。UPDATE 操作用于修改数据库中已存在的记录,是数据库管理中的一个重要操作。

准备工作

首先,确保你的项目中已安装 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; } }

基本的 UPDATE 操作

更新单个记录

以下是一个基本的更新单个记录的方法:

C#
public static int UpdateRecord(SQLiteConnection connection, string tableName, Dictionary<string, object> updateData, string whereClause) { try { string setClause = string.Join(", ", updateData.Keys.Select(k => $"{k} = @{k}")); string sql = $"UPDATE {tableName} SET {setClause} WHERE {whereClause}"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { foreach (var item in updateData) { command.Parameters.AddWithValue($"@{item.Key}", item.Value); } int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"成功更新 {rowsAffected} 条记录。"); return rowsAffected; } } catch (Exception ex) { Console.WriteLine($"更新记录时出错:{ex.Message}"); return -1; } }

使用示例:

C#
var updateData = new Dictionary<string, object> { { "Age", 31 }, { "Email", "newemail@example.com" } }; UpdateRecord(connection, "Users", updateData, "Id = 1");

image.png

更新多个记录

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

C#
public static int UpdateMultipleRecords(SQLiteConnection connection, string tableName, Dictionary<string, object> updateData, string whereClause) { return UpdateRecord(connection, tableName, updateData, whereClause); }

使用示例:

C#
var updateData = new Dictionary<string, object> { { "Status", "Inactive" } }; UpdateMultipleRecords(connection, "Users", updateData, "LastLoginDate < date('now', '-1 year')");

使用参数化查询进行更新

为了防止 SQL 注入攻击并提高性能,我们应该使用参数化查询。上面的方法已经使用了参数化查询,但这里是一个更明确的例子:

C#
public static int UpdateRecordParameterized(SQLiteConnection connection, string tableName, Dictionary<string, object> updateData, string whereClause, Dictionary<string, object> whereParams) { try { string setClause = string.Join(", ", updateData.Keys.Select(k => $"{k} = @set_{k}")); string sql = $"UPDATE {tableName} SET {setClause} WHERE {whereClause}"; using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { foreach (var item in updateData) { command.Parameters.AddWithValue($"@set_{item.Key}", item.Value); } foreach (var item in whereParams) { command.Parameters.AddWithValue($"@{item.Key}", item.Value); } int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"成功更新 {rowsAffected} 条记录。"); return rowsAffected; } } catch (Exception ex) { Console.WriteLine($"参数化更新记录时出错:{ex.Message}"); return -1; } }

使用示例:

C#
var updateData = new Dictionary<string, object> { { "Age", 32 }, { "Email", "updated@example.com" } }; var whereParams = new Dictionary<string, object> { { "id", 1 } }; UpdateRecordParameterized(connection, "Users", updateData, "Id = @id", whereParams);

高级 UPDATE 操作

使用子查询进行更新

SQLite 支持在 UPDATE 语句中使用子查询。以下是一个使用子查询的更新方法:

C#
public static int UpdateWithSubquery(SQLiteConnection connection, string tableName, string updateColumn, string subquery, string whereClause) { try { string sql = $"UPDATE {tableName} SET {updateColumn} = ({subquery}) 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; } }

使用示例:

C#
string subquery = "CAST((SELECT AVG(Age) FROM Users) AS INTEGER)"; UpdateWithSubquery(connection, "Users", "Age", subquery, "Age < 18");

使用事务进行更新

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

C#
public static bool UpdateWithTransaction(SQLiteConnection connection, List<string> updateQueries) { using (SQLiteTransaction transaction = connection.BeginTransaction()) { try { foreach (string query in updateQueries) { 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> { "UPDATE Users SET Status = 'Active' WHERE Id = 1", "UPDATE Orders SET OrderStatus = 'Shipped' WHERE UserId = 1" }; UpdateWithTransaction(connection, queries);

image.png

完整示例

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

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) { // 更新单个记录 var singleUpdateData = new Dictionary<string, object> { { "Age", 31 }, { "Email", "updated@example.com" } }; UpdateRecord(connection, "Users", singleUpdateData, "Id = 1"); // 更新多个记录 var multipleUpdateData = new Dictionary<string, object> { { "Status", "Inactive" } }; UpdateMultipleRecords(connection, "Users", multipleUpdateData, "LastLoginDate < date('now', '-1 year')"); // 参数化更新 var paramUpdateData = new Dictionary<string, object> { { "Age", 32 }, { "Email", "param@example.com" } }; var whereParams = new Dictionary<string, object> { { "id", 2 } }; UpdateRecordParameterized(connection, "Users", paramUpdateData, "Id = @id", whereParams); // 使用子查询更新 string subquery = "CAST((SELECT AVG(Age) FROM Users) AS INTEGER)"; UpdateWithSubquery(connection, "Users", "Age", subquery, "Age < 18"); // 使用事务更新 var queries = new List<string> { "UPDATE Users SET Status = 'Active' WHERE Id = 3", "UPDATE Orders SET OrderStatus = 'Shipped' WHERE UserId = 3" }; UpdateWithTransaction(connection, queries); // 关闭连接 connection.Close(); } } // 在这里实现所有上述方法 }

注意事项

  1. 始终使用参数化查询来防止 SQL 注入攻击。
  2. 在更新大量数据时,考虑使用事务来确保数据一致性和提高性能。
  3. 在执行更新操作之前,最好先使用 SELECT 语句确认要更新的记录。
  4. 更新操作可能会影响多行数据,所以要仔细设计 WHERE 子句。
  5. 在完成操作后,记得关闭数据库连接。
  6. 对于频繁执行的更新操作,可以考虑使用预处理语句(prepared statements)来提高性能。

结论

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

本文作者:技术老小子

本文链接:

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