成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

說說抽象SQL(參數(shù)化)的查詢

數(shù)據(jù)庫
什么是參數(shù)化查詢?知道它的原理是什么嗎?不用的SQL指令是如何寫的?又是如何實現(xiàn)抽象查詢的?本文將問你解答。

什么是參數(shù)化查詢?

一,定義

參數(shù)化查詢(Parameterized Query 或 Parameterized Statement)是指在設(shè)計與數(shù)據(jù)庫鏈接并訪問數(shù)據(jù)時,在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù) (Parameter) 來給值,這個方法目前已被視為最有效可預(yù)防SQL注入攻擊 (SQL Injection) 的攻擊手法的防御方式。

有部份的開發(fā)人員可能會認為使用參數(shù)化查詢,會讓程序更不好維護,或者在實現(xiàn)部份功能上會非常不便,然而,使用參數(shù)化查詢造成的額外開發(fā)成本,通常都遠低于因為SQL注入攻擊漏洞被發(fā)現(xiàn)而遭受攻擊,所造成的重大損失。

原理

在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成 SQL 指令的編譯后,才套用參數(shù)運行,因此就算參數(shù)中含有具有損的指令,也不會被數(shù)據(jù)庫所運行。

SQL 指令撰寫方法

在撰寫 SQL 指令時,利用參數(shù)來代表需要填入的數(shù)值,例如:

Microsoft SQL Server

Microsoft SQL Server 的參數(shù)格式是以 "@" 字符加上參數(shù)名稱而成,SQL Server 亦支持匿名參數(shù) "?"。

SELECT * FROM myTable WHERE myID = @myID

INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)

Microsoft Access

Microsoft Access 不支持具名參數(shù),只支持匿名參數(shù) "?"。

UPDATE myTable SET c1 = ?, c2 = ?, c3 = ? WHERE c4 = ?

MySQL

MySQL 的參數(shù)格式是以 "?" 字符加上參數(shù)名稱而成。

UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4

Oracle

Oracle 的參數(shù)格式是以 ":" 字符加上參數(shù)名稱而成。

UPDATE myTable SET c1 = :c1, c2 = :c2, c3 = :c3 WHERE c4 = :c4

PostgreSQL

PostgreSQL 的參數(shù)格式是以 "$" 字符加上參數(shù)順序號而成。

UPDATE myTable SET c1 = $1, c2 = $2, c3 = $3 WHERE c4 = $4

PostgreSQL也支持Oracle的參數(shù)表示形式

--------------------------------------------------------------------------------

總結(jié)一下各數(shù)據(jù)庫對于參數(shù)符號的定義:

SQLSERVER @

Access,MySQL ?

Oracle :

PostgreSQL $

上面的這些符號是各數(shù)據(jù)庫內(nèi)部原生支持的方式,但是具體到ADO.NET調(diào)用的時候,采用各數(shù)據(jù)庫原生的.NET驅(qū)動程序,發(fā)現(xiàn)除了Oracle,各種數(shù)據(jù)庫都可以在SQL語句中用@符號表示參數(shù);

采用各數(shù)據(jù)庫的OleDB或者ODBC驅(qū)動程序,都要求使用 ?符號表示參數(shù)。

還有其它本文未說到的數(shù)據(jù)庫,他們的SQL語句表示參數(shù)的符號可能都是不一樣的,怎么樣在程序里面統(tǒng)一處理呢?本文主題開始了:

二,抽象SQL參數(shù)化查詢

在PDF.NET數(shù)據(jù)開發(fā)框架中,對參數(shù)的定義統(tǒng)一采用##來處理,具體格式如下:

#參數(shù)名字[:參數(shù)類型],[數(shù)據(jù)類型],[參數(shù)長度],[參數(shù)輸出輸入類型]#

上面定義當中,中括號里面的內(nèi)容都是可選的。

詳細內(nèi)容,請參看“SQL-MAP規(guī)范”

對本文第一部分的示例,可以改寫成下面的方式:

  1. UPDATE myTable SET   
  2. c1 = #c1#,   
  3. c2 = #c2:String#,   
  4. c3 = #c3:String,Sring,50#   
  5. WHERE c4 = #c4:Int32#  

如果不指定參數(shù)的類型,默認為String類型,例如c1參數(shù)。

程序在運行時,會根據(jù)當前具體的數(shù)據(jù)庫訪問程序?qū)嵗?,?#內(nèi)部的參數(shù)替換成合適的參數(shù)內(nèi)容。

上面這種參數(shù)形式是寫在SQL-MAP配置文件里面的,例如下面的一個實際的SQL-MAP查詢腳本:

  1. <Select CommandName="GetStatisticsAnalysis_SalerRoleStatistics" CommandType="Text" Method="" Description="" ResultClass="DataSet"> 
  2.        <![CDATA[  
  3.     SELECT a.角色,a.銷售金額/10000 銷售金額,a.占比 FROM [GetStatisticsAnalysis_SalerRoleStatistics] (  
  4.    #manageid:Int32#, #min:String#, #max:String#) a]]> 
  5.      </Select> 

通過這種方式,完全屏蔽了不同種類的數(shù)據(jù)庫查詢的參數(shù)問題,將SQL參數(shù)化查詢抽象了出來。

看到這里本文似乎該結(jié)束了,但本文的標題“參數(shù)化”加了一個括號,說明我們抽象的不僅僅是參數(shù),我們還可以抽象整個SQL查詢。

三,抽象SQL查詢:SQL-MAP技術(shù)

在本文第二部分,我們將SQL中的參數(shù)“抽象化”了,我們還可以進一步抽象整個SQL,看下面的抽象過程:

  1. 編寫任意形式的合法SQL查詢語句;
  2. 抽象SQL中的參數(shù);
  3. 將整個SQL語句抽象成一個唯一名字為CommandName;
  4. 將一組CommandName映射到一個DAL類文件;
  5. 將這個CommandName映射到一個DAL類的方法名稱;
  6. 將SQL語句中的參數(shù)名稱映射到該DAL類的當前方法中的參數(shù)名稱;
  7. 將整個SQL腳本文件映射到一個DAL程序集。

這個思想,就是SQL-MAP,將SQL語句映射為程序的。

下面我們介紹一下PDF.NET數(shù)據(jù)開發(fā)框架對于存儲過程的操作思路,當然對于單條SQL也是如此。當然,單條SQL語句的操作我們不必請出SQL-MAP這種“重量級”的方式,還是使用框架中的ORM技術(shù)OQL吧,但這不是本文討論的話題。

首先,在SQL-MAP配置文件里面寫下面的腳本:

  1. <Select CommandName="GetProductManage_FundSaleAndAIP" Method="" CommandType="Text" Description="獲取XXX列表" ResultClass="DataSet">    
  2. <![CDATA[    
  3. select * from GetProductManage_FundSaleAndAIP(#Type:String#,#Name:String#,#isAIP:String#)    
  4. ]]>   
  5. </Select>    

注意腳本中的ResultClass屬性,它可以將查詢映射成為單值,DataSet,實體類,實體類集合。

有了這個SQL-MAP文件,我們可以使用代碼工具自動生成下面的代碼(當然你也可以手寫):

  1. /// <summary>    
  2.    /// 獲取XXXXX列表    
  3.    /// </summary>    
  4.    /// <param name="Type"></param>    
  5.    /// <param name="Name"></param>    
  6.    /// <param name="isAIP"></param>    
  7.    /// <returns></returns>    
  8.    public DataSet GetProductManage_FundSaleAndAIP(String Type  , String Name  , String isAIP   )     
  9.    {     
  10.            //獲取命令信息    
  11.            CommandInfo cmdInfo=Mapper.GetCommandInfo("GetProductManage_FundSaleAndAIP");    
  12.            //參數(shù)賦值,推薦使用該種方式;    
  13.            cmdInfo.DataParameters[0].Value = Type;    
  14.            cmdInfo.DataParameters[1].Value = Name;    
  15.            cmdInfo.DataParameters[2].Value = isAIP;    
  16.            //參數(shù)賦值,使用命名方式;    
  17.            //cmdInfo.SetParameterValue("@Type", Type);    
  18.            //cmdInfo.SetParameterValue("@Name", Name);    
  19.            //cmdInfo.SetParameterValue("@isAIP", isAIP);    
  20.            //執(zhí)行查詢    
  21.            return CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText , cmdInfo.DataParameters);    
  22.        //    
  23.    }//End Function   

從上面的過程可以看出,框架采用SQL-MAP技術(shù),將SQL語句(包括各種查詢的單條SQL語句和存儲過程等)映射成了DAL層代碼,整個過程不需要了解.NET開發(fā)技術(shù),所以DAL層的代碼完全可以由DBA來寫,而業(yè)務(wù)開發(fā)人員只要調(diào)用DAL代碼即可。

采用這種技術(shù),DBA可以寫高效的有數(shù)據(jù)庫特性的SQL,如果要換數(shù)據(jù)庫,只需要換一個配置文件即可,不需要重寫程序。

題外話:

SQL-MAP思想并非PDF.NET數(shù)據(jù)開發(fā)框架獨有,實際上,該思想也是從著名的iBatis框架借鑒而來的,但與iBatis不同的是,PDF.NET的SQL-MAP參數(shù)不需要定義專門的“參數(shù)類”,也不需要寫額外的XML文件指明查詢結(jié)果如何與實體類映射,所以整個開發(fā)過程大大簡化,簡化到你只需要會寫SQL語句,就可以寫DAL代碼。

原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/05/06/2038727.html

【編輯推薦】

  1. 淺述遠程Service Broker的實現(xiàn)
  2. Service Broker基礎(chǔ)應(yīng)用(下)
  3. Service Broker基礎(chǔ)應(yīng)用(上)
  4. 簡述Service Broker事件通知功能
  5. 優(yōu)化你的DiscuzNT,讓它跑起來

 

責任編輯:艾婧 來源: 博客園
相關(guān)推薦

2010-06-17 14:43:29

SQL Server參

2013-01-15 10:53:36

2013-01-16 14:29:22

2009-06-25 16:45:31

Hibernate

2021-08-03 08:41:18

SQLMysql面試

2015-08-19 14:22:01

SQL Server參數(shù)

2018-04-19 09:02:14

SQL ServerSQL性能優(yōu)化

2011-06-16 13:36:01

Top查詢

2011-03-17 13:54:42

查詢參數(shù)SQL語句利用率

2011-07-20 09:19:47

SQL Server

2010-09-07 10:42:12

SQL語句

2011-07-18 14:45:26

2009-05-20 10:58:15

數(shù)據(jù)庫查詢初始化

2011-08-25 09:33:25

MySQL運維

2011-09-13 09:35:37

SQL Server集群

2011-07-14 09:37:53

SQL Server

2011-08-15 15:56:31

SQL Server

2015-08-26 16:26:19

SQL

2024-11-11 08:11:39

2020-12-17 09:38:16

設(shè)計模式參數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久国产精品久久久久 | 四虎成人精品永久免费av九九 | 欧美综合在线观看 | 成人av一区 | 超碰人人做 | 男人天堂色 | 精品久久久久久久久久久久 | 亚洲国产区 | 欧美精品二区 | 久久99精品久久久 | 成人在线免费视频 | 91久久国产综合久久 | 一级毛片免费看 | 精品国产1区2区3区 一区二区手机在线 | 国内精品久久久久 | 精品综合久久久 | 国产一卡二卡三卡 | av一级久久| 欧美日韩中文字幕 | 999久久久 | 亚洲欧美日韩成人在线 | 超碰在线免费公开 | 98成人网| avhd101在线成人播放 | 午夜免费在线 | 95国产精品 | 在线a视频 | 拍真实国产伦偷精品 | 国产精品综合一区二区 | 一区二区三区av | 国产中文字幕网 | 欧美激情a∨在线视频播放 成人免费共享视频 | 国产一区二区三区 | 日韩精品一区二区三区第95 | 久草免费在线视频 | www久久久 | 国产精品久久777777 | 中文字幕1区 | 狠狠干综合视频 | 亚洲一区二区精品视频 | 午夜精品久久久久久久99黑人 |