本文将详细介绍如何使用 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;
}
}
以下是一个基本的更新单个记录的方法:
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");
对于需要更新多个记录的情况,我们可以使用类似的方法,但可能需要更复杂的 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);
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);
以下是一个完整的示例,展示了如何使用上述所有方法:
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();
}
}
// 在这里实现所有上述方法
}
本文详细介绍了如何使用 C# 在 SQLite 数据库中执行各种 UPDATE 操作,包括基本更新、参数化更新、使用子查询的更新以及使用事务的更新。这些操作覆盖了大多数常见的数据更新场景。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!