使用反射向SQL Server数据库插入数据时如何正确传递参数?
问题核心原因&修复方案
你的代码主要存在4处问题,对应修复方式如下:
- 拼接字段名结尾的多余符号处理错误:你遍历字段时追加的是
,(逗号加空格),仅删除最后1个字符会残留空格,需要删除最后2个字符 - 参数名不匹配:SQL里定义的参数是带
@前缀的,添加参数时需要保留前缀才能和SQL匹配 - 未给参数赋值:需要通过反射读取传入对象的属性值,赋值给对应参数,注意属性值为null时要转成
DBNull.Value,否则数据库会识别报错 - 缺少执行插入的逻辑:参数配置完成后需要调用命令的执行方法完成插入操作
修正后的完整代码
public class MyORM<T> where T : IData { // 假设你已经在类里完成了SqlConnection的初始化赋值 private SqlConnection _sqlConnection; public void Insert(T item) { var sql = new StringBuilder("Insert into "); var type = item.GetType(); var properties = type.GetProperties(); sql.Append(type.Name); sql.Append(" ("); foreach (var property in properties) { sql.Append(property.Name); sql.Append(", "); } // 删掉最后多余的 ", " 两个字符 sql.Remove(sql.Length - 2, 2); sql.Append(") values ("); foreach (var property in properties) { sql.Append('@').Append(property.Name).Append(','); } // 参数部分末尾只有多余逗号,删1个字符即可 sql.Remove(sql.Length - 1, 1); sql.Append(");"); var query = sql.ToString(); using var command = new SqlCommand(query, _sqlConnection); foreach (var property in properties) { // 加上@前缀,同时读取属性值,处理null的情况 var value = property.GetValue(item) ?? DBNull.Value; command.Parameters.AddWithValue($"@{property.Name}", value); } // 执行插入操作,提前确认连接状态 if (_sqlConnection.State != System.Data.ConnectionState.Open) { _sqlConnection.Open(); } command.ExecuteNonQuery(); } }
内容的提问来源于stack exchange,提问作者Mizanur Rahaman
相关产品推荐
相关产品推荐

