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
相关产品推荐
相关产品推荐

