已在数据库中创建以下存储过程:
@se_code_melli varchar(10) = NULL,
@se_name nvarchar(30) = NULL,
@se_family nvarchar(30) = NULL,
@se_name_uni nvarchar(100) = NULL,
@se_name_reshte_tahsili nvarchar(50) = NULL
使用以下命令,我想从C#程序中运行存储过程:
if (comboBox11.SelectedIndex == -1)
{
comboBox11.SelectedValue = DBNull.Value;
}
if (comboBox12.SelectedIndex == -1)
{
comboBox12.SelectedValue = DBNull.Value;
}
sqlParams = new SqlParameter[]
{
new SqlParameter { ParameterName = "@se_code_melli", Value = (String.IsNullOrEmpty(textBox23.Text) ? DBNull.Value : (object)textBox23.Text)},
new SqlParameter { ParameterName = "@se_name", Value = (String.IsNullOrEmpty(textBox22.Text) ? DBNull.Value : (object)textBox22.Text)},
new SqlParameter { ParameterName = "@se_family", Value = (String.IsNullOrEmpty(textBox21.Text) ? DBNull.Value : (object)textBox21.Text)},
new SqlParameter { ParameterName = "@se_name_uni", Value =comboBox11.SelectedValue},
new SqlParameter { ParameterName = "@se_name_reshte_tahsili", Value =comboBox12.SelectedValue}
};
using (SamenEntities dbContext = new SamenEntities())
{
dataGridView1.DataSource = dbContext.Database.SqlQuery<SamenEntities>("storedProcedureName", sqlParams).SingleOrDefault();
}
但是出现以下错误:
System.Data.SqlClient.SqlException:“参数化查询'(@se_code_melli nvarchar(10),@ se_name nvarchar(4000),@ se_family'期望参数'@se_name_uni',但未提供。'>
我试图解决NULL问题,但没有成功。
答案 0 :(得分:3)
ADO.NET具有真正的 奇特功能:如果参数的值为null
,则不会发送 。这会使所有人 感到困惑。相反,您必须手动避免添加null
,而是添加DBNull.Value
。
很显然,您的comboBox11.SelectedValue = DBNull.Value;
尝试无效,因此,请在ADO.NET级别进行设置。
例如:
new SqlParameter {
ParameterName = "@se_name_uni",
Value = (object)comboBox11.SelectedValue ?? DBNull.Value
},
或者,大多数ORM或微型ORM工具都知道会自动为您执行此操作。