You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用反射向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:54:02