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

C# DataGridView绑定报错:DataRowView无法映射到原生类型

问题解决:ComboBox选择值填充DataGridView报错

错误原因

你直接将driverSelect.SelectedValue传入SQL参数,但此时SelectedValue返回的是DataRowView对象,SQL数据提供程序无法将该对象转换为数据库可识别的原生类型,因此抛出System.ArgumentException错误。

解决步骤

1. 确保ComboBox绑定配置正确

绑定ComboBox时,必须设置ValueMember为你需要传递给数据库的字段名(比如司机ID、司机编号等),示例代码:

// 假设你的数据源是存储司机信息的DataTable
driverSelect.DataSource = driverDataTable;
driverSelect.DisplayMember = "司机姓名"; // 界面显示的文本
driverSelect.ValueMember = "司机ID"; // 实际要传给数据库的字段

2. 修改查询代码,提取实际字段值

修改参数赋值部分,从SelectedValue中获取真实的字段值,而不是直接传入DataRowView对象:

using (SqlConnection sqlcon = new SqlConnection(connstring))
{
    DataTable dt = new DataTable();
    sqlcon.Open();
    using (SqlCommand cmd = new SqlCommand("display", sqlcon))
    {
        // 获取选中项的实际字段值
        object driverParamValue;
        if (driverSelect.SelectedValue is DataRowView rowView)
        {
            // 替换为你设置的ValueMember对应的字段名
            driverParamValue = rowView["司机ID"];
        }
        else
        {
            driverParamValue = driverSelect.SelectedValue;
        }

        cmd.Parameters.AddWithValue("@driver", driverParamValue);
        cmd.CommandType = CommandType.StoredProcedure;
        
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            dt.Load(reader);
        }
        // 无需手动关闭sqlcon,外层using会自动处理
    }

    dataGridView1.DataSource = dt;
}

简化写法(如果确认ValueMember已正确设置)

如果已经确保ValueMember配置正确,也可以直接转换为对应的数据类型:

// 若字段是字符串类型
cmd.Parameters.AddWithValue("@driver", driverSelect.SelectedValue.ToString());

// 若字段是整数类型
cmd.Parameters.AddWithValue("@driver", Convert.ToInt32(driverSelect.SelectedValue));

额外注意

不要手动调用sqlcon.Close(),外层的using语句会在代码块执行完毕后自动释放连接资源,手动关闭可能引发不必要的异常。

内容的提问来源于stack exchange,提问作者Paggy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:50:39