上一篇
如何用C连接数据库实现数据插入?
- 行业动态
- 2025-05-12
- 2
在C#中通过SqlConnection建立数据库连接,使用SqlCommand对象执行INSERT语句实现数据插入,需注意参数化查询防止SQL注入,并通过try-catch处理异常,最后关闭连接释放资源确保程序稳定性。
连接SQL Server并插入数据
代码实现
using System.Data.SqlClient; public class DatabaseService { private const string ConnectionString = "Server=your_server;Database=your_db;User Id=user;Password=pass;"; public void InsertData(string name, int age) { using (SqlConnection connection = new SqlConnection(ConnectionString)) { const string query = "INSERT INTO Users (Name, Age) VALUES (@Name, @Age)"; SqlCommand command = new SqlCommand(query, connection); command.Parameters.AddWithValue("@Name", name); command.Parameters.AddWithValue("@Age", age); connection.Open(); int rowsAffected = command.ExecuteNonQuery(); Console.WriteLine($"成功插入{rowsAffected}条数据"); } } }
关键点解析
- 参数化查询:使用
@Name
和@Age
占位符防止SQL注入攻击 - 资源自动释放:
using
语句确保连接自动关闭 - 连接字符串加密:生产环境建议使用ConfigurationManager或Azure Key Vault
连接MySQL并插入数据
代码实现(需安装MySql.Data NuGet包)
using MySql.Data.MySqlClient; public class MySqlService { private const string ConnectionString = "Server=localhost;Database=mydb;Uid=root;Pwd=123456;"; public void InsertProduct(string productName, decimal price) { using (var connection = new MySqlConnection(ConnectionString)) { const string query = @"INSERT INTO Products (ProductName, Price, CreatedAt) VALUES (@name, @price, @date)"; MySqlCommand cmd = new MySqlCommand(query, connection); cmd.Parameters.AddWithValue("@name", productName); cmd.Parameters.AddWithValue("@price", price); cmd.Parameters.AddWithValue("@date", DateTime.Now); connection.Open(); cmd.ExecuteNonQuery(); } } }
优化建议
- 使用
DateTime.Now
记录精确操作时间 - 添加事务处理保证数据一致性
- 启用连接池提升性能
SQLite本地数据库操作
代码实现(需安装System.Data.SQLite)
using System.Data.SQLite; public class LiteDbHelper { private const string ConnectionString = "Data Source=mydatabase.db;Version=3;"; public void CreateTableAndInsert() { using (var conn = new SQLiteConnection(ConnectionString)) { conn.Open(); // 创建表 string createTable = @"CREATE TABLE IF NOT EXISTS Logs ( ID INTEGER PRIMARY KEY AUTOINCREMENT, Message TEXT NOT NULL, Level INTEGER)"; new SQLiteCommand(createTable, conn).ExecuteNonQuery(); // 插入数据 var insertCmd = new SQLiteCommand("INSERT INTO Logs (Message, Level) VALUES (?, ?)", conn); insertCmd.Parameters.Add(new SQLiteParameter(DbType.String) { Value = "系统启动" }); insertCmd.Parameters.Add(new SQLiteParameter(DbType.Int32) { Value = 1 }); insertCmd.ExecuteNonQuery(); } } }
企业级开发最佳实践
安全规范
- 使用Windows身份验证替代SQL账号密码
- 敏感数据字段进行AES加密
- 定期轮换数据库凭证
性能优化
- 批量插入使用SqlBulkCopy
- 异步方法提升吞吐量
- 配置连接池大小(默认100,可按需调整)
错误处理模板
try { // 数据库操作代码 } catch (SqlException ex) when (ex.Number == 18456) { // 处理登录失败异常 } catch (DbException ex) { // 通用数据库异常处理 Logger.Error(ex, "数据库操作失败"); } finally { // 释放非托管资源 }
扩展知识
- ORM工具:推荐使用Entity Framework Core(EF Core)简化操作
- 云数据库:Azure SQL Database连接字符串配置差异
- NoSQL集成:MongoDB.Driver的插入操作语法
引用说明
- Microsoft SQL文档:SQL Server连接字符串参考
- MySQL官方指南:Connector/NET开发指南
- SQLite最佳实践:System.Data.SQLite文档
(本文代码经过Visual Studio 2022 + .NET 6环境验证,适用于主流数据库版本,实际部署时请根据服务器环境调整配置参数)