c# - 在实体框架中调用存储过程后返回所有行
问题描述
在数据库中创建了以下存储过程,存储过程在数据库中正常工作:
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);
}
如何解决搜索器问题?
解决方案
您的查询结合了对搜索条件的检查和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
--[...]
推荐阅读
- python - 将 Python HTTP 请求转换为 curl
- python - 尝试下标时出现不可下标错误
- python - 基于 Python 的按名称查找对象的方法
- c++ - 在 C++ 中创建动态数据类型
- python - 我可以使用 python 看门狗来触发另一个文件执行吗
- c++ - 哪些 VertexList 类型对 depth_first_search 有效
- excel - excel中具有多个条件的依赖单元格值
- python - 如何真正分享上传到 Google Colab 的 Jupyter notebook?
- laravel - 如何在Octobercms的前端显示attachMany图像?
- html - 如何将地理位置添加到我的网络应用程序