上一篇
如何用C高效实现数据库表格数据的连接与操作?
- 行业动态
- 2025-05-11
- 5
C#通过ADO.NET或Entity Framework连接数据库,使用SqlConnection对象配置连接字符串,建立与SQL Server等数据库的通信,执行SQL命令或LINQ操作,实现数据查询、更新及事务管理,适用于桌面、Web应用的高效数据交互。
C#连接数据库操作指南
在软件开发领域,数据库连接是核心技能之一,本文将通过具体代码示例,详解如何用C#连接常见数据库(如SQL Server、MySQL、SQLite等),并说明如何安全高效地操作数据,以下内容基于官方文档和行业最佳实践整理,确保技术准确性与实用性。
C#连接数据库的基础原理
C#通过ADO.NET技术实现与数据库的交互,其核心组件包括:
- Connection:建立与数据库的连接通道
- Command:执行SQL语句或存储过程
- DataReader:读取查询结果
- DataAdapter:填充数据集(DataSet)
常用NuGet包:
System.Data.SqlClient
(SQL Server)MySql.Data
(MySQL)System.Data.SQLite
(SQLite)
连接不同数据库的代码实现
连接SQL Server
using System.Data.SqlClient; string connectionString = "Server=服务器地址;Database=数据库名;User Id=用户名;Password=密码;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); // 执行查询或操作 string sql = "SELECT * FROM Users"; using (SqlCommand command = new SqlCommand(sql, connection)) { using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["UserName"]); } } } }
连接MySQL
using MySql.Data.MySqlClient; string connectionString = "Server=服务器地址;Database=数据库名;Uid=用户名;Pwd=密码;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); // 参数化查询示例 string sql = "INSERT INTO Products (Name, Price) VALUES (@name, @price)"; using (MySqlCommand cmd = new MySqlCommand(sql, connection)) { cmd.Parameters.AddWithValue("@name", "笔记本电脑"); cmd.Parameters.AddWithValue("@price", 5999); cmd.ExecuteNonQuery(); } }
连接SQLite
using System.Data.SQLite; string dbPath = "Data Source=./mydatabase.db;Version=3;"; using (SQLiteConnection connection = new SQLiteConnection(dbPath)) { connection.Open(); // 创建表示例 string createTableSql = @"CREATE TABLE IF NOT EXISTS Logs ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Message TEXT NOT NULL, CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP)"; using (SQLiteCommand cmd = new SQLiteCommand(createTableSql, connection)) { cmd.ExecuteNonQuery(); } }
数据库操作的四大核心功能
数据查询(SELECT)
using (var command = connection.CreateCommand()) { command.CommandText = "SELECT * FROM Orders WHERE Total > @minAmount"; command.Parameters.AddWithValue("@minAmount", 1000); // 使用DataTable接收结果 using (SqlDataAdapter adapter = new SqlDataAdapter(command)) { DataTable dt = new DataTable(); adapter.Fill(dt); } }
数据插入(INSERT)
string insertSql = "INSERT INTO Employees (Name, Department) VALUES (@name, @dept)"; using (var cmd = new SqlCommand(insertSql, connection)) { cmd.Parameters.AddWithValue("@name", "张三"); cmd.Parameters.AddWithValue("@dept", "技术部"); int affectedRows = cmd.ExecuteNonQuery(); }
数据更新(UPDATE)
string updateSql = "UPDATE Products SET Stock=Stock-1 WHERE Id=@productId"; using (var cmd = new SqlCommand(updateSql, connection)) { cmd.Parameters.AddWithValue("@productId", 101); cmd.ExecuteNonQuery(); }
数据删除(DELETE)
string deleteSql = "DELETE FROM TempData WHERE ExpireDate < @currentDate"; using (var cmd = new SqlCommand(deleteSql, connection)) { cmd.Parameters.AddWithValue("@currentDate", DateTime.Now); cmd.ExecuteNonQuery(); }
安全与性能优化建议
防范SQL注入
- 始终使用参数化查询
- 避免拼接SQL字符串
- 对用户输入进行严格验证
资源管理
- 使用
using
语句自动释放连接 - 配置连接池(Connection Pooling)
- 设置合理的连接超时时间
- 使用
异常处理
try { // 数据库操作代码 } catch (SqlException ex) { Console.WriteLine($"数据库错误: {ex.Number} - {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"系统异常: {ex.Message}"); }
常见问题解答
Q:连接字符串应该怎么保护?
A:建议将连接字符串存储在appsettings.json
或环境变量中,不要硬编码在代码里。
Q:如何处理大并发下的数据库连接?
A:启用ADO.NET自带的连接池(默认开启),通过配置Max Pool Size
调整最大连接数。
Q:EF Core和ADO.NET如何选择?
A:简单查询用EF Core提高效率,复杂操作或高性能场景建议直接用ADO.NET。
引用说明
本文技术要点参考自:
- 微软官方ADO.NET文档
- MySQL Connector/NET开发者指南
- 《C#数据库编程实战》清华大学出版社
- OWASP SQL注入防御指南