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

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

create procedure [dbo].[search_pazhoheshgar]
@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
AS
begin try
begin tran
SET NOCOUNT ON;
select sabt.code_melli, sabt.name, sabt.family, sabt_como_univercity.name_uni,
sabt_como_reshte.name_reshte_tahsili
from sabt 
inner join sabt_como_univercity ON sabt.univercity = sabt_como_univercity.id_uni
inner join sabt_como_reshte ON sabt.name_reshte = sabt_como_reshte.id_reshte_tahsili
where 
sabt.code_melli like '%' + @se_code_melli + '%' or 
sabt.name like '%' + @se_name + '%' or  
sabt.family like '%' + @se_family + '%' or
sabt_como_univercity.name_uni like '%' + @se_name_uni + '%' or
sabt_como_reshte.name_reshte_tahsili like '%' + @se_name_reshte_tahsili + '%'
commit tran
end try
begin catch
rollback tran
return -1
end catch

С помощью приведенных ниже команд я хочу запустить хранимую процедуру из программы на C #:

SqlParameter[] sqlParams;
string sqlQuery;
sqlQuery = "search_pazhoheshgar @se_code_melli, @se_name, @se_family, @se_name_uni, @se_name_reshte_tahsili";

sqlParams = new SqlParameter[]
        {
new SqlParameter { ParameterName = "@se_code_melli",  Value = (object)textBox23.Text ?? DBNull.Value},
new SqlParameter { ParameterName = "@se_name",  Value = (object)textBox22.Text ?? DBNull.Value},
new SqlParameter { ParameterName = "@se_family",  Value = (object)textBox21.Text ?? DBNull.Value},
new SqlParameter { ParameterName = "@se_name_uni",  Value = (object)comboBox11.Text ?? DBNull.Value},
new SqlParameter { ParameterName = "@se_name_reshte_tahsili",  Value = (object)comboBox12.Text ?? DBNull.Value}
        };

using (SamenEntities dbContext = new SamenEntities())
{
    dataGridView1.DataSource = dbContext.Database.SqlQuery<search_pazhoheshgar_Result>(sqlQuery, sqlParams).ToList();
}

Но после запуска все существующие строки отображаются из базы данных. Также я использовал следующий способ для запуска хранимой процедуры. Но, опять же, отображаются все строки:

using (SamenEntities dbContext = new SamenEntities())
    {
    dataGridView1.DataSource = dbContext.search_pazhoheshgar(textBox23.Text, textBox22.Text, textBox21.Text, comboBox11.Text, comboBox12.Text);
    }

Как я могу исправить проблему поисковика?

1 Ответ

0 голосов
/ 04 сентября 2018

Ваш запрос объединяет проверку критериев поиска с условием OR. Это означает, что когда только одна из записей является пустой строкой, вы получите полный набор результатов (кроме случаев, когда соответствующий столбец равен NULL).

Ваше выражение Value = (object)textBox23.Text ?? DBNull.Value никогда не даст DBNull, потому что TextBox.Text будет иметь значение "" вместо null. Таким образом, вы передадите пустую строку в вашу хранимую процедуру, что приведет к ...

abt.code_melli LIKE '%' + @se_code_melli + '%'

... чтобы оценить ...

abt.code_melli LIKE '%%'

, который выдаст весь набор результатов (кроме случаев, когда столбец содержит значение NULL), независимо от того, что находится в других ваших параметрах (потому что они объединены с OR).

Вы должны защититься от этого в вашем WHERE состоянии:

--[...]
WHERE 
    @se_code_melli IS NOT NULL AND @se_code_melli <> '' AND
        sabt.code_melli LIKE '%' + @se_code_melli + '%' OR 
    @se_name IS NOT NULL AND @se_name <> '' AND sabt.name LIKE '%' + @se_name + '%' OR  
    --[...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...