如何通过单条查询将C#对象的所有值插入MySQL表中
实现动态插入C#对象到MySQL的代码示例
核心思路是通过反射读取对象属性,动态生成参数化的INSERT语句,既避免SQL注入风险,也能适配任意结构的实体类。
首先需要安装MySqlConnector NuGet包作为MySQL驱动。
SaveData方法实现
using MySqlConnector; using System.Reflection; using System.Threading.Tasks; public class DataAccess { /// <summary> /// 动态插入实体对象到MySQL表 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="operateType">操作类型,此处默认处理插入逻辑</param> /// <param name="entity">已赋值的实体对象</param> /// <param name="connectionString">MySQL数据库连接串</param> public async Task SaveData<T>(string operateType, T entity, string connectionString) { // 默认约定实体类名即为对应表名,可自行扩展读取自定义Table特性的值适配自定义表名 string tableName = typeof(T).Name; // 读取实体的所有公共可读写属性 var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead) .ToList(); // 生成列名列表,加反引号避免和MySQL关键字冲突 var columnNames = properties.Select(p => $"`{p.Name}`"); // 生成参数占位符 var paramPlaceholders = properties.Select(p => $"@{p.Name}"); // 拼接完整INSERT语句 string insertSql = $"INSERT INTO `{tableName}` ({string.Join(", ", columnNames)}) VALUES ({string.Join(", ", paramPlaceholders)})"; using var conn = new MySqlConnection(connectionString); await conn.OpenAsync(); using var cmd = new MySqlCommand(insertSql, conn); // 批量给参数赋值 foreach (var prop in properties) { object value = prop.GetValue(entity) ?? DBNull.Value; cmd.Parameters.AddWithValue($"@{prop.Name}", value); } await cmd.ExecuteNonQueryAsync(); } }
调用示例
和你预期的调用形式完全匹配:
// DeviceDb为你的MySQL连接串 await dataAccess.SaveData("insert into", mcReadings, DeviceDb);
可选优化方案
- 列名映射:如果实体属性名和表列名不一致,可以自定义
Column特性,反射时读取特性值作为列名 - 自增列过滤:自定义
InsertIgnore特性,反射时跳过带有该特性的自增主键列,无需手动赋值 - 反射结果缓存:频繁调用该方法时可缓存每个实体类型的属性列表,降低反射性能损耗
内容的提问来源于stack exchange,提问作者Tom Boudniatski
相关产品推荐
相关产品推荐

