# C# WinForm 将 TextBox 数据写入 SQLite 数据库完整指南
本文将详细介绍如何在 C# WinForm 应用程序中将 TextBox 控件中的数据输入到 SQLite 数据库中,包含完整的代码示例和最佳实践。
## 1. 环境准备与项目配置
### 1.1 安装 SQLite 支持库
首先需要通过 NuGet 包管理器安装 System.Data.SQLite 库:
```csharp
// 在包管理器控制台中执行
Install-Package System.Data.SQLite
```
或者在 Visual Studio 的 NuGet 包管理器中搜索并安装 `System.Data.SQLite` 包 [ref_2]。
### 1.2 添加必要的命名空间
在代码文件的顶部添加以下命名空间:
```csharp
using System.Data.SQLite;
using System.Windows.Forms;
```
## 2. 数据库连接与表结构设计
### 2.1 创建数据库连接字符串
```csharp
// 定义数据库连接字符串
private string connectionString = "Data Source=mydatabase.db;Version=3;";
// 或者指定完整路径
private string connectionString = @"Data Source=C:\MyApp\Data\mydatabase.db;Version=3;";
```
SQLite 数据库文件可以放在应用程序目录或指定路径,无需安装数据库服务器即可使用 [ref_4]。
### 2.2 创建数据表
在应用程序启动时创建必要的数据表结构:
```csharp
private void CreateTable()
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string createTableSQL = @"
CREATE TABLE IF NOT EXISTS UserData (
ID TEXT PRIMARY KEY,
Name TEXT NOT NULL,
Email TEXT,
Phone TEXT,
CreatedDate TEXT
)";
using (SQLiteCommand cmd = new SQLiteCommand(createTableSQL, conn))
{
cmd.ExecuteNonQuery();
}
}
}
```
## 3. 核心数据插入实现
### 3.1 基础数据插入方法
以下是将 TextBox 数据插入 SQLite 数据库的核心方法:
```csharp
private void InsertDataToSQLite()
{
try
{
// 获取 TextBox 中的数据
string userName = txtName.Text.Trim();
string userEmail = txtEmail.Text.Trim();
string userPhone = txtPhone.Text.Trim();
// 验证数据完整性
if (string.IsNullOrEmpty(userName))
{
MessageBox.Show("请输入姓名!");
return;
}
// 生成唯一ID和当前时间
string uniqueId = Guid.NewGuid().ToString();
string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
// 使用参数化查询防止SQL注入
string insertSQL = @"
INSERT INTO UserData (ID, Name, Email, Phone, CreatedDate)
VALUES (@Id, @Name, @Email, @Phone, @CreatedDate)";
using (SQLiteCommand cmd = new SQLiteCommand(insertSQL, conn))
{
// 添加参数
cmd.Parameters.AddWithValue("@Id", uniqueId);
cmd.Parameters.AddWithValue("@Name", userName);
cmd.Parameters.AddWithValue("@Email", userEmail);
cmd.Parameters.AddWithValue("@Phone", userPhone);
cmd.Parameters.AddWithValue("@CreatedDate", currentTime);
// 执行插入操作
int rowsAffected = cmd.ExecuteNonQuery();
if (rowsAffected > 0)
{
MessageBox.Show("数据插入成功!");
ClearTextBoxes(); // 清空输入框
}
else
{
MessageBox.Show("数据插入失败!");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"发生错误:{ex.Message}");
}
}
```
### 3.2 使用事务提高性能
对于批量插入操作,可以使用事务来提高性能 [ref_4]:
```csharp
private void InsertMultipleRecords(List<UserInfo> userList)
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
using (SQLiteTransaction transaction = conn.BeginTransaction())
{
try
{
string insertSQL = @"INSERT INTO UserData (ID, Name, Email) VALUES (@Id, @Name, @Email)";
foreach (var user in userList)
{
using (SQLiteCommand cmd = new SQLiteCommand(insertSQL, conn))
{
cmd.Parameters.AddWithValue("@Id", Guid.NewGuid().ToString());
cmd.Parameters.AddWithValue("@Name", user.Name);
cmd.Parameters.AddWithValue("@Email", user.Email);
cmd.ExecuteNonQuery();
}
}
transaction.Commit();
MessageBox.Show("批量插入成功!");
}
catch (Exception ex)
{
transaction.Rollback();
MessageBox.Show($"批量插入失败:{ex.Message}");
}
}
}
}
```
## 4. 界面设计与事件处理
### 4.1 WinForm 界面设计
创建包含多个 TextBox 和按钮的窗体:
```xml
<!-- 在 Form 设计中添加以下控件 -->
<TextBox Name="txtName" PlaceholderText="请输入姓名"/>
<TextBox Name="txtEmail" PlaceholderText="请输入邮箱"/>
<TextBox Name="txtPhone" PlaceholderText="请输入电话"/>
<Button Name="btnSave" Text="保存数据" Click="btnSave_Click"/>
<Button Name="btnClear" Text="清空数据" Click="btnClear_Click"/>
```
### 4.2 按钮点击事件处理
```csharp
private void btnSave_Click(object sender, EventArgs e)
{
InsertDataToSQLite();
}
private void btnClear_Click(object sender, EventArgs e)
{
ClearTextBoxes();
}
private void ClearTextBoxes()
{
txtName.Clear();
txtEmail.Clear();
txtPhone.Clear();
txtName.Focus(); // 将焦点设置回第一个输入框
}
```
## 5. 完整示例代码
以下是完整的窗体类实现:
```csharp
public partial class MainForm : Form
{
private string connectionString = "Data Source=mydatabase.db;Version=3;";
public MainForm()
{
InitializeComponent();
CreateTable(); // 初始化时创建表
}
private void CreateTable()
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string sql = @"
CREATE TABLE IF NOT EXISTS UserData (
ID TEXT PRIMARY KEY,
Name TEXT NOT NULL,
Email TEXT,
Phone TEXT,
CreatedDate TEXT
)";
using (SQLiteCommand cmd = new SQLiteCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
}
private void btnSave_Click(object sender, EventArgs e)
{
SaveUserData();
}
private void SaveUserData()
{
if (string.IsNullOrEmpty(txtName.Text.Trim()))
{
MessageBox.Show("姓名不能为空!");
return;
}
try
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string sql = @"
INSERT INTO UserData (ID, Name, Email, Phone, CreatedDate)
VALUES (@Id, @Name, @Email, @Phone, @Date)";
using (SQLiteCommand cmd = new SQLiteCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@Id", Guid.NewGuid().ToString());
cmd.Parameters.AddWithValue("@Name", txtName.Text.Trim());
cmd.Parameters.AddWithValue("@Email", txtEmail.Text.Trim());
cmd.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd.Parameters.AddWithValue("@Date", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
int result = cmd.ExecuteNonQuery();
if (result > 0)
{
MessageBox.Show("数据保存成功!");
ClearForm();
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"保存失败:{ex.Message}");
}
}
private void ClearForm()
{
txtName.Clear();
txtEmail.Clear();
txtPhone.Clear();
}
}
```
## 6. 最佳实践与注意事项
### 6.1 数据验证
在插入数据前进行充分验证:
```csharp
private bool ValidateInput()
{
if (string.IsNullOrWhiteSpace(txtName.Text))
{
MessageBox.Show("姓名不能为空");
return false;
}
if (!string.IsNullOrEmpty(txtEmail.Text) && !IsValidEmail(txtEmail.Text))
{
MessageBox.Show("邮箱格式不正确");
return false;
}
return true;
}
private bool IsValidEmail(string email)
{
try
{
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch
{
return false;
}
}
```
### 6.2 错误处理与日志记录
```csharp
private void LogError(string methodName, Exception ex)
{
string logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {methodName} - {ex.Message}";
File.AppendAllText("error.log", logMessage + Environment.NewLine);
}
```
### 6.3 性能优化建议
| 优化措施 | 说明 | 实施方法 |
|---------|------|----------|
| 使用连接池 | 减少连接创建开销 | SQLite 自动管理连接 |
| 参数化查询 | 防止 SQL 注入,提高性能 | 使用 Parameters.AddWithValue |
| 事务处理 | 批量操作时显著提升性能 | 使用 SQLiteTransaction |
| 异步操作 | 避免界面冻结 | 使用 async/await |
通过以上完整的实现方案,您可以轻松地将 WinForm 中 TextBox 的数据安全、高效地存储到 SQLite 数据库中。这种方法适用于各种数据收集场景,如用户注册、信息采集、配置保存等应用 [ref_1][ref_3][ref_6]。