根据ComboBox1选中项填充ComboBox2时遇CS1503错误求原因
解决CS1503错误:无法将string转换为NpgsqlDbType
错误原因
报错的核心问题是NpgsqlCommand.Parameters.AddWithValue的参数顺序错误。当需要指定参数数据类型时,正确的参数顺序是参数名称、数据类型、参数值,你代码里把参数值和数据类型的位置写反了,导致类型不匹配触发CS1503错误。
修正后的代码
同时修正了几个额外问题:
- SQL语句参数名需加
@前缀(符合Npgsql的参数规范) - 移除了多余的
ExecuteNonQuery()调用(该方法用于增删改操作,查询只需用ExecuteReader()) - 去掉手动调用的
connection.Close(),using块会自动释放连接资源 - 增加空值判断,避免
SelectedValue为空时的异常 - 将代码中填充控件从
comboBox3调整为你描述的comboBox2(实际是comboBox3可自行改回)
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { // 先判断SelectedValue是否为空,防止空引用异常 if (comboBox1.SelectedValue == null) return; string selectedValue = comboBox1.SelectedValue.ToString(); // 替换为你的实际数据库连接字符串 using (var connection = new NpgsqlConnection("你的数据库连接字符串")) { connection.Open(); // 参数名添加@前缀,符合Npgsql参数规范 var command = new NpgsqlCommand("SELECT brand_name FROM brand WHERE material_type = @Value", connection); // 修正参数顺序:参数名、数据类型、参数值 command.Parameters.AddWithValue("@Value", NpgsqlDbType.Char, selectedValue); var reader = command.ExecuteReader(); // 填充前清空ComboBox2的原有项 comboBox2.Items.Clear(); while (reader.Read()) { comboBox2.Items.Add(reader["brand_name"].ToString()); } } }
额外注意事项
- 如果数据库中
material_type字段类型不是char,请对应调整NpgsqlDbType(比如varchar类型用NpgsqlDbType.Varchar) - 确保
comboBox1的SelectedValue为字符串类型,使用ToString()比强制转换更安全
内容的提问来源于stack exchange,提问作者Mertau
相关产品推荐
相关产品推荐

