CPQuery 解决拼接SQL的新方法
query = query + " and ProductName like '" + p.ProductName + "'";
复制代码 代码如下:
query = query + " and ProductID = " + p.ProductID.ToString();但是,解决方案并非只有ORM一种,还有些人就是喜欢写SQL呢。
我认为参数化的SQL语句可以解决本文开头所说的那些问题,尤其是前二个。对于代码的维护问题,我的观点是:如果你硬是将SQL与C#混在一起,那么参数化的SQL语句也是没有办法的。如果想解决这个问题,你需要将SQL语句与项目代码分离,然后可以选择以配置文件或者存储过程做为保存那些SLQ语句的容器。
query = query + " and UnitPrice >= " + p.UnitPrice.ToString();
if( p.CategoryID > 0 )
if( p.ProductID > 0 )
如果你认为这2个原因很难解决的话,那我今天就给你 “一种改动极小却可以解决上面二个缺点”的解决方案,改造后的代码如下:
不过,有些人可能会说:我的业务逻辑很复杂,Where中的过虑条件不可能事先确定,因此不拼接SQL还不行。
4. CPQuery 也是这个解决方案中核心类型的名称。
1. CPQuery 是一个缩写:Concat Parameterized Query
query = query + " and Quantity >= " + p.Quantity.ToString();
3. 影响代码的可维护性:SQL语句与C#混在一起,想修改SQL就得重新编译程序,而且二种代码混在一起,可读性也不好。
if( string.IsNullOrEmpty(p.Unit) == false )
if( string.IsNullOrEmpty(p.ProductName) == false )
if( p.CategoryID > 0 )
query = query + " and ProductName like '" + p.ProductName + "'";
参数化的SQL语句
1. 不安全:有被SQL注入的风险。
复制代码 代码如下:
所以,参数化的SQL并不是万能的,代码的可维护性与技术的选择无关,与架构的设计有关。任何优秀的技术都可能写出难以维护的代码来,这就是我的观点。1. 这种拼接SQL语句的方式很简单,非常容易实现。
你看到差别了吗?
复制代码 代码如下:
query = query + " and Unit = '" + p.Unit + "'";CPQuery适合哪些人使用?
query = query + " and CategoryID = " + p.CategoryID.ToString();
对于需要动态查询的场景,我认为:拼接SQL或许是必需的,但是,你不要将数值也拼接到SQL语句中嘛,或者说,你应该拼接参数化的SQL来解决你遇到的问题。
差别在于第一行代码,后面调用了一个扩展方法:AsCPQuery(true) ,这个方法的实现代码我后面再说。
query = query + " and Quantity >= " + p.Quantity.ToString();
2. CPQuery 可以让你继续使用熟悉的拼接方式来写参数化的SQL
下面是我的回答:
var query = "select ProductID, ProductName from Products where (1=1) ";
因此,喜欢手写SQL的人们通常会这样写查询:
if( string.IsNullOrEmpty(p.ProductName) == false )
所以,这篇博客不是写给ORM用户的,而是写给所有喜欢写SQL语句的朋友。
query = query + " and ProductID = " + p.ProductID.ToString();
if( p.UnitPrice > 0 )
说到【拼接参数化SQL】,我想解释一下这个东西了。
如果使用这种方式,本文开头所说的前二个缺点肯定是存在的。
希望大家能记住CPQuery这个名字。
这个示例的主要关键代码如下:
query = query + " and UnitPrice >= " + p.UnitPrice.ToString();
是的,的确ORM可以解决这些问题。
还是说动态查询,假设我有这样一个查询界面:
我想很多人应该是知道参数化查询的,最终放弃或许有以下2个原因:
query = query + " and Unit = '" + p.Unit + "'";
if( p.Quantity > 0 )
看到博客的标题,你会不会想:CPQuery是什么?
这个方法的实现方式是:拼接SQL语句时,不要把参数值拼接到SQL语句中,在SQL语句中使用占位符参数,具体的参数值通过ADO.NET的command.Parameters.Add()传入。现在流行的ORM工具应该都会采用这个方法。
2. 便于包装自己的API,参数只需要一个(万能的)字符串!
if( string.IsNullOrEmpty(p.Unit) == false )
CPQuery是什么?
答:适合于喜欢手写SQL代码的人,尤其是当需要写动态查询时。
所以我通常会选择【参数化SQL】的方法去实现数据库的访问过程,而且会将SQL语句与项目代码(C#)分离开。
显然,在设计程序时,不可能知道用户会输入什么样的过滤条件。
if( p.ProductID > 0 )
if( p.Quantity > 0 )
3. CPQuery 是我设计的一种解决方案,它可以解决拼接SQL的前二个缺点。
我一直都不喜欢在访问数据库时采用拼接SQL的方法,原因有以下几点:
if( p.UnitPrice > 0 )
query = query + " and CategoryID = " + p.CategoryID.ToString();
看到这些缺点,ORM用户可能会认为:使用ORM工具就是终极的解决方案。
var query = "select ProductID, ProductName from Products where (1=1) ".AsCPQuery(true);
2. 可能会影响性能:每条SQL语句都需要数据库引擎执行[语句分析]之类的开销。
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/mssql/2201.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
sql server 关于设置null的一
时间:2020-12-28
-
详解SQL游标的用法
时间:2020-12-27
-
vs code连接sql server数据库步
时间:2020-12-27
-
图书管理系统的sqlserver数
时间:2020-12-25
-
详解SQL 通配符
时间:2020-12-25
-
sql四大排名函数之ROW_NUM
时间:2020-12-25
-
SQLServer数据库处于恢复挂
时间:2020-12-24
-
Win10 64位安装个人版SQL20
时间:2020-12-24
热门文章
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
-
SQL Server数据库入门学习总结
时间:2020-12-10
-
使用SqlBulkCopy时应注意Sqlserver表中使用缺
时间:2020-12-09
