使用空值执行存储过程

问题描述 投票:1回答:1

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

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

c# entity-framework stored-procedures
1个回答
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工具都会自动为您执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.