C#sqlite批量插入数据
时间: 2025-01-03 13:32:41 浏览: 5
### 实现C#中的SQLite批量插入
为了高效地执行大批量的数据插入操作,在C#中可以采用事务处理以及参数化查询来减少SQL语句解析的时间开销并防止SQL注入攻击。下面是一个简单的例子展示怎样利用`System.Data.SQLite`库来进行批量插入[^1]。
```csharp
using System;
using System.Collections.Generic;
using System.Data.SQLite;
class Program {
static void Main() {
string connectionString = "Data Source=:memory:";
using (var connection = new SQLiteConnection(connectionString)) {
connection.Open();
// 创建表结构
using (var command = new SQLiteCommand(connection))
command.ExecuteNonQuery(@"
CREATE TABLE IF NOT EXISTS Users (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL UNIQUE
)");
var usersToInsert = GenerateUsers(10_000); // 假设有1万条记录待插入
// 开启事务
using (var transaction = connection.BeginTransaction()) {
try {
foreach(var user in usersToInsert) {
using (var cmd = new SQLiteCommand(
@"INSERT INTO Users(Name) VALUES (@name)",
connection,
transaction)) {
cmd.Parameters.AddWithValue("@name", user.Name);
cmd.ExecuteNonQuery();
}
}
// 提交更改
transaction.Commit();
} catch(Exception ex){
Console.WriteLine($"An error occurred: {ex.Message}");
// 发生错误时回滚所有未提交的操作
if(transaction != null && !transaction.Connection.Equals(null)){
transaction.Rollback();
}
}
}
}
}
private static List<User> GenerateUsers(int count) => Enumerable.Range(1, count).Select(i => new User{
Name = $"User{i}"
}).ToList();
}
public class User {
public int Id { get; set; }
public string Name { get; set; }
}
```
上述代码片段展示了创建一个临时数据库连接,并定义了一个名为`Users`的表格用于存储用户信息。通过循环迭代一组预生成的对象列表,每次迭代都会构建一条带有参数占位符(`@name`)的新命令对象,并将其绑定到当前事务上下文中。当所有的插入都成功完成后,则调用`Commit()`方法正式保存这些修改;如果过程中遇到任何异常情况则会触发捕获逻辑并通过`Rollback()`来回退之前所做的全部变更以保持数据的一致性和完整性。
阅读全文