//写一个存储过程
ALTER PROCEDURE dbo.Infosearch

    (
@bmid smallint = null,
@xm varchar()=null,
@xb varchar()=null,
@strage smallint=null,
@endage smallint=null,
@zzmm varchar()=null,
@xl varchar()=null,
@zw varchar()=null
) AS
/* SET NOCOUNT ON */
declare @sql varchar()
if @bmid is not null
begin
set @sql=' where 部门ID='+Convert(varchar(),@bmid)
end if @xm is not null
begin
if @sql is not null
set @sql=@sql+' and 姓名like'+@xm
else set @sql=' where 姓名like'+@xm
end if @xb is not null
begin
if @sql is not null
set @sql=@sql+' and 性别='+@xb
else set @sql=' where 性别='+@xb
end if @strage is not null
begin
if @sql is not null
set @sql=@sql+' and 年龄between '+Convert(varchar(),@strage)
else set @sql=' where 年龄between '+Convert(varchar(),@strage)
end if @endage is not null
begin
set @sql=@sql+' and '+Convert(varchar(),@endage)
end if @zzmm is not null
begin
if @sql is not null
set @sql=@sql+' and 政治面貌='+@zzmm
else set @sql=' where 政治面貌='+@zzmm
end if @xl is not null
begin
if @sql is not null
set @sql=@sql+' and 学历='+@xl
else set @sql=' where 学历='+@xl
end if @zw is not null
begin
if @sql is not null
set @sql=@sql+' and 职位='+@zw
else set @sql=' where 职位='+@zw
end exec('select 职工号,姓名,性别,年龄,学历,婚姻状况,政治面貌from yuangong'+@sql)
RETURN ALTER PROCEDURE dbo.Infosearch (
@bmid smallint = null,
@xm varchar()=null,
@xb varchar()=null,
@strage smallint=null,
@endage smallint=null,
@zzmm varchar()=null,
@xl varchar()=null,
@zw varchar()=null
) AS
/* SET NOCOUNT ON */
declare @sql varchar()
if @bmid is not null
begin
set @sql=' where 部门ID='+Convert(varchar(),@bmid)
end if @xm is not null
begin
if @sql is not null
set @sql=@sql+' and 姓名like'+@xm
else set @sql=' where 姓名like'+@xm
end if @xb is not null
begin
if @sql is not null
set @sql=@sql+' and 性别='+@xb
else set @sql=' where 性别='+@xb
end if @strage is not null
begin
if @sql is not null
set @sql=@sql+' and 年龄between '+Convert(varchar(),@strage)
else set @sql=' where 年龄between '+Convert(varchar(),@strage)
end if @endage is not null
begin
set @sql=@sql+' and '+Convert(varchar(),@endage)
end if @zzmm is not null
begin
if @sql is not null
set @sql=@sql+' and 政治面貌='+@zzmm
else set @sql=' where 政治面貌='+@zzmm
end if @xl is not null
begin
if @sql is not null
set @sql=@sql+' and 学历='+@xl
else set @sql=' where 学历='+@xl
end if @zw is not null
begin
if @sql is not null
set @sql=@sql+' and 职位='+@zw
else set @sql=' where 职位='+@zw
end exec('select 职工号,姓名,性别,年龄,学历,婚姻状况,政治面貌from yuangong'+@sql)
RETURN
//判断参数是否为空来决定怎样拼接查询语句

如果是多条件查询的话
存储过程里面就一个参数就够了

这个参数是不定条件查询语句
多条件之中判断那个是否为空 如果为空填充1=1 不为空就为条件

 public static IDataReader ExecuteReader(DbCommand comm, string sql, params object[] value)
{
comm.CommandText = sql;
if (value != null && value.Length >= )
{
if (comm.CommandText.IndexOf("?") == -)
{
string[] temp = sql.Split('@');
for (int i = ; i < value.Length; i++)
{
string pName;
if (temp[i + ].IndexOf(" ") > -)
{
pName = "@" + temp[i + ].Substring(, temp[i + ].IndexOf(" "));
}
else
{
pName = "@" + temp[i + ];
}
//pName = "@p" + (i + 1).ToString();
DbParameter p = comm.CreateParameter();
p.DbType = DbType.String;
p.ParameterName = pName;
p.Value = value[i];
comm.Parameters.Add(p);
}
}
else
{
string[] temp = sql.Split('?');
for (int i = ; i < value.Length; i++)
{
temp[i] = temp[i] + "@p" + (i + ).ToString();
string pName = "@p" + (i + ).ToString();
DbParameter p = comm.CreateParameter();
p.DbType = DbType.String;
p.ParameterName = pName;
p.Value = value[i];
comm.Parameters.Add(p);
}
StringBuilder sb = new StringBuilder();
for (int i = ; i < temp.Length; i++)
{
sb.Append(temp[i]);
}
comm.CommandText = sb.ToString();
}
}
if (comm.Connection.State != ConnectionState.Open)
{
comm.Connection.Open();
}
return comm.ExecuteReader(CommandBehavior.CloseConnection);
} 调用的时候类似:ExecuteReaderParams(comm, "select * from xx where id=? and name=?",id,name);

C#参数化SQL查询的更多相关文章

  1. SQL Server-聚焦深入理解动态SQL查询(三十二)

    前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...

  2. SQL Server参数化SQL语句中的like和in查询的语法(C#)

    sql语句进行 like和in 参数化,按照正常的方式是无法实现的 我们一般的思维是: Like参数化查询:string sqlstmt = "select * from users whe ...

  3. SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题

    数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...

  4. SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

    parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象.想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的 ...

  5. 执行原始的 SQL 查询

    The Entity Framework Code First API includes methods that enable you to pass SQL commands directly t ...

  6. 在ADO.NET中使用参数化SQL语句访问不同数据库时的差异

    在ADO.NET中经常需要跟各种数据库打交道,在不实用存储过程的情况下,使用参数化SQL语句一定程度上可以防止SQL注入,同时对一些较难赋值的字段(如在SQL Server中Image字段,在Orac ...

  7. 参数化SQL小认识

    在做机房收费系统项目,编写数据连接并访问数据库时,见别人都用了带“@”字符的SQL语句,就很好奇为什么都用这个语句呢?直接拼写SQL语句不是更加方便吗?带着这个问题上网查资料,才知道原来他们用的是参数 ...

  8. SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?

    前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比ex ...

  9. 不得不看,只有专家才知道的17个SQL查询提速秘诀!

    不得不看,只有专家才知道的17个SQL查询提速秘诀! 原创 2018-01-23 布加迪编译 51CTO技术栈 “ 除非你遵循本文介绍的这些技巧,否则很容易编写出减慢查询速度或锁死数据库的数据库代码. ...

随机推荐

  1. Docker 1.12.0将要发布的新功能

    Docker 1.12.0将要发布的新功能 导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并 ...

  2. cocos2dx-lua使用UIListView制作二级折叠菜单

    折叠菜单,用过jquery accordion的同学都知道是啥玩艺儿~,图片效果就是介样: cocos2dx不带有此控件,因此我们动手来实现一个. 原理很简单,展开的时候往listview里inser ...

  3. MTD NANDFLASH驱动相关知识介绍

    转:http://blog.csdn.net/zhouzhuan2008/article/details/11053877 目录 MTD总概述 MTD数据结构 MTD相关层实现 MTD,Memory ...

  4. 对shell中的与(&&)和或(||)的理解

    先说明一下: 如果第一个命令执行成功,与操作符 (&&)才会执行第二个命令 如果第一个命令执行失败,或操作符 (||)才会执行第二个命令 可以分析一下下面的命令的输出: #!/bin/ ...

  5. Clairewd’s message

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

  6. 修改Intellij Idea 创建maven项目默认Java编译版本

    在使用Intellij Idea 创建Maven项目时,默认的Java Language是1.5,虽然可以在Project Structrue中修改,但是每次pom.xml文件有变化时,工程又会重置到 ...

  7. 1.7.4 Query Syntax and Parsing

    1. 查询语法和解析 这部分主要说明了如何指定被使用的查询解析器.同样描述了主查询解析器的支持的语法和功能.同时还描述了在特定环境下使用的其他查询解析器.这里有一些普通查询解析器都能使用的参数,将会在 ...

  8. solr查询在solrconfig.xml中的配置

    <requestHandler name="/select" class="solr.SearchHandler"> <lst name=&q ...

  9. Java中Integer的最大值和最小值

    从JDK1.0开始,Integer中就定义了MIN_VALUE和MAX-VALUE两个常量: /** * A constant holding the minimum value an {@code ...

  10. Linux_netstat 详解

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...