Выполнить хранимую процедуру с нулевыми значениями - PullRequest
0 голосов
/ 01 сентября 2018

В базе данных создана следующая хранимая процедура:

@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 голосов
/ 02 сентября 2018

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 могут сделать это автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...