使用空值执行存储过程

时间:2018-09-01 18:43:17

标签: c# entity-framework stored-procedures

已在数据库中创建以下存储过程:

@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问题,但没有成功。

1 个答案:

答案 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工具都知道会自动为您执行此操作。