编程经验点滴 动态SQL的拼接技巧

常见的误解有:
1. 只用 ado.net ,无法进行动态 SQL 拼接。
2. 有几个动态参数,代码的重复量就成了这些参数的不同数量的组合数,动态参数越多,重复量越大。

对于第二个问题,以下的错误代码为其证据:


代码如下:

if(id>0 && string.IsNullOrEmpty(name))
{
command.CommandText = "select * from t1 where id=?";
command.Parameters.Add(id);
}
if(id<=0 && !string.IsNullOrEmpty(name))
{
command.CommandText = "select * from t1 where name=?";
command.Parameters.Add(name);
}
if(id<=0 && !string.IsNullOrEmpty(name))
{
command.CommandText = "select * from t1 where id=? and name=?";
command.Parameters.Add(id);
command.Parameters.Add(name);
}

这两个问题都很好解决,给一个正确的代码例子大家看看即可:


代码如下:

string sql ="select * from t1 where 1=1";
if(id != null)
{
sql += " and id=?";
addParameterValue(cmd,id);
}
if(!string.IsNullOrEmpty(name))
{
sql += " and name=?";
addParameterValue(cmd,name);
}
command.CommandText = sql;

这里的技巧在于,使用了一个 "where 1=1", 巧妙解决了后续 sql 拼接中,每行开头是否要有 "and" 的问题。而这个 "where 1=1",并不会对数据库的索引执行,造成性能上的影响。

对参数进行排列组合,然后写各种组合的 SQL,这个思路很奇怪。问题是,很多初学者,都有这个思维习惯。本人不是计算机科班出身,不知道是否哪本教科书,就是如此教导的。但很不幸的是,这个思维习惯是错误的。

"where 1=1" 虽是教科书中没有的小技巧,却很管用。

另外,在程序中,一般会在用户界面上让使用用户录入数字,这个数字的数值,在代码中会自动变成 string,然后尝试 string 转换成 int/long,最后送到 sql 函数里。这里需要特别注意的是,很多人把某个特殊的数值,作为“用户无录入的默认值”,正如本文开头所写的错误代码那样:

代码如下:

if(id>0 && string.IsNullOrEmpty(name))

问题在于,0 是否是不正常的业务数值,代码中看不出来。不排除程序员随意指定一个数值,作为“用户无录入的默认值”,如果不巧这个默认值,实际上是有其他意义的,那就造成问题。

在数据库的理论中,没有指定的数据,是用 null 来表示的,不论是 string 还是 int/long。

这是一个很好的思路,同样可以用在这里的 sql 拼接中。因此,我们在后面的代码中,使用了这个:


代码如下:

if(id != null)

上述代码中,

addParameterValue(cmd,name); 是一个简单封装的函数,用来封装如下一小段代码,目的是让最后的代码,较为简捷直观:


代码如下:

DbParameter p = cmd.CreateParameter();
p.ParameterName = "@XXX";
p.Value = TTT;
cmd.Parameters.Add(p);

当然,这个 addParameterValue() 封装函数,是可有可无的。多写几个 DbParameter p = cmd.CreateParameter() 并没有什么大问题。

(0)

相关推荐

  • MySQL 存储过程中执行动态SQL语句的方法

    drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500); set my_sqll='select * from aa_list'; set @ms=my_sqll; PREPARE s1 from @ms; EXECUTE s1; deallocate prepare s1; end;

  • oracle中动态SQL使用详细介绍

    1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.

  • 批处理 动态sql

    1. DECLARE TYPE ref_cursor_type IS ref CURSOR; v_mycursor ref_cursor_type; TYPE id_list IS TABLE OF integer; TYPE name_list IS TABLE OF varchar2(30); v_tabid id_list:=id_list(); v_tabname name_list:=name_list(); sql_str varchar2(200); BEGIN --查询所以行,放

  • mysql存储过程 在动态SQL内获取返回值的方法详解

    MySql通用分页存储过程过程参数 复制代码 代码如下: p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int,out p_recordcount int,out p_pagecount int $:begin    declare v_sqlcounts varchar(4000);    declare v_s

  • sqlserver 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)

    1,场景:根据学生编号查询,返回该学生所在班级的所有学生.支持分页.自定义排序及结果集自动定位到查询条件的学生编号所在页. 复制代码 代码如下: CREATE PROC [dbo].[Sp_testpagerandsorting] (@GroupID INT, @CurrentId INT, @TimeFrom DATETIME, @TimeTo DATETIME, @OrderBy CHAR(50), @PageSize INT, @CurrentPage INT) AS SET nocoun

  • 动态SQL语句使用心得

    在我们的项目中经常需要用到分面功能,而我以前呢用的方法现在看起来都是那麽的笨拙,当时是这样做的,每当要进行数据分页时就专们针对那个表做分页,大家别笑,以前确实好笨.呵呵,虽然当时也有一个想法就是希望能够传入一张表进去进行操作,但那样的话编译是通不过的,因为FROM后面操作的是表变量,而不能是我们自定义的变量,所以当时没有深追究,现在为当时不深入学习而BS一下. 动态SQL需要准备以下内容: 1.@SQL 拼接后的SQL语句,可以是你任意需要的SQL语句如:SET @SQL='SELECT * F

  • 为什么ASP中执行动态SQL总报错误信息?提示语句语法错误

    问:为什么ASP中执行动态SQL总报错误信息?提示语句语法错误 答: 有时候写ASP用conn.execute(sql)查询.更新.插入Access数据库数据时,明明正确的语句却往往会显示sql语句错误,相当恼火,特进行了归纳,可适当为字段添加"["."]"解决: 复制代码 代码如下: 例1:select * from a  如出现错误,可改为:select * from [a]  例2:UPDATE [user] SET password = '"&am

  • 基于Oracle的高性能动态SQL程序开发

    正在看的ORACLE教程是:基于Oracle的高性能动态SQL程序开发. 摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧. 关键词:动态SQL,PL/SQL,高性能 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输

  • mybatis的动态sql详解(精)

    MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用 JSTL或其他相似的基于XML的文本处理器相似.在MyBatis之前的版本中,有很多

  • 编程经验点滴 动态SQL的拼接技巧

    常见的误解有: 1. 只用 ado.net ,无法进行动态 SQL 拼接. 2. 有几个动态参数,代码的重复量就成了这些参数的不同数量的组合数,动态参数越多,重复量越大. 对于第二个问题,以下的错误代码为其证据: 复制代码 代码如下: if(id>0 && string.IsNullOrEmpty(name)) { command.CommandText = "select * from t1 where id=?"; command.Parameters.Add

  • 关于Mybatis动态sql中test的坑点总结

    目录 总结Mybatis动态sql中test的坑 判断相等的注意点 判断字符是否相等 动态sql标签的小陷阱 下面先举个正常的例子 总结Mybatis动态sql中test的坑 在mybatis中要实现动态sql,重要方式就是使用test,通过其中表达式返回的true.false来达到动态sql的拼接.随着业务的复杂,test中的判断将会越来越复杂,所以熟悉test中细节处理对动态sql来说尤为重要. 判断相等的注意点 == 少打一个= 现在我们有一个Integer类型的参数typeId,需要当t

  • PL/SQL编程经验小结开发者网络Oracle

    正在看的ORACLE教程是:PL/SQL编程经验小结开发者网络Oracle.平时在PL/SQL中的编程中遇到一些问题,这里以问答的形式来进行把它们总结下来,以供大家分享. 1.当需要向表中装载大量的数据流或者需要处理大量的数据流的时候,能否使用管道提高处理效率? 管道函数对于改善并行查询的性能非常方便,它加快往表中加载数据的速度.管道函数的使用总结如下两点: 每当在查询里使用PL/SQL函数时,该查询将被序列化,即一个处理器只能运行一个查询实例,那么在这种情况下不可能使用并行查询(比如在数据仓库

  • Android编程实现输入框动态自动提示功能

    本文实例讲述了Android编程实现输入框动态自动提示功能.分享给大家供大家参考,具体如下: 关于AutoCompleteTextView的使用,我想大家并不陌生,对其设定上Adapter后系统便能自己识别与匹配了.近期 一个项目中,需要做到匹配通迅录中的电话号码和联系人,由于通迅录中数据量大,所以把所有的数据在自己提示之前就查询出来并加入到 AutoCompleteTextView中是不现实的,所以我们可以使用cursor来动态加载AutoCompleteTextView的数据,从而 实现时时

  • MyBatis实践之动态SQL及关联查询

    序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

  • Java的MyBatis框架中对数据库进行动态SQL查询的教程

    其实MyBatis具有的一个强大的特性之一通常是它的动态 SQL 能力. 如果你有使用 JDBC 或其他 相似框架的经验,你就明白要动态的串联 SQL 字符串在一起是十分纠结的,确保不能忘了空格或在列表的最后省略逗号.Mybatis中的动态 SQL 可以彻底处理这种痛苦.对于动态SQL,最通俗简单的方法就是我们自己在硬编码的时候赋予各种动态行为的判断,而在Mybatis中,用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中.动态 SQL 元素和使用 JS

  • 自己动手实现mybatis动态sql的方法

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计对动态sql都不陌生,如果没有用过,就当看看热闹吧.我第一次接触mysql是在大四的时候,当时就觉得动态sql这东西很牛,很灵活,一直想搞明白怎么实现的,尽管当时已经能够写ioc,mvc和简单的orm框架(仿mybaits但是没有动态sql部分),但是仍然找不到mybatis核心的动态sql到底在哪

  • MyBatis中动态sql的实现方法示例

    1. 动态sql 动态sql是mybatis中的一个核心,什么是动态sql? 动态sql即对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.有些时候,SQL语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可

随机推荐