国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

教您使用參數化SQL語句

數據庫 SQL Server
SQL語句的使用非常靈活,通過各種SQL語句,可以實現不同功能的操作,下面將為您介紹參數化SQL語句,供您參考,希望對您有所幫助。

SQL語句的使用非常靈活,通過各種SQL語句,可以實現不同功能的操作,下面將為您介紹參數化SQL語句,供您參考,希望對您有所幫助。

SQL注入的方法有兩種:

一是所有的SQL語句都存放在存儲過程中,這樣不但可以避免SQL注入,還能提高一些性能,并且存儲過程可以由專門的數據庫管理員(DBA)編寫和集中管理,不過這種做法有時候針對相同的幾個表有不同條件的查詢,SQL語句可能不同,這樣就會編寫大量的存儲過程,所以有人提出了第二種方案:參數化SQL語句。例如我們在本篇中創建的表UserInfo中查找所有女性用戶,那么通常情況下我們的SQL語句可能是這樣:

1 select * from UserInfo where sex=0

在參數化SQL語句中我們將數值以參數化的形式提供,對于上面的查詢,我們用參數化SQL語句表示為: 

1 select * from UserInfo where sex=@sex

再對代碼中對這個SQL語句中的參數進行賦值,假如我們要查找UserInfo表中所有年齡大于30歲的男性用戶,這個參數化SQL語句可以這么寫:

1 select * from UserInfo where sex=@sex and age>@age

下面是執行這個查詢并且將查詢結果集以DataTable的方式返回的代碼: 

01 //實例化Connection對象 
02 SqlConnection connection = new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=''"); 
03 //實例化Command對象 
04 SqlCommand command = new SqlCommand("select * from UserInfo where sex=@sex and age>@age", connection); 
05 //***種添加查詢參數的例子 
06 command.Parameters.AddWithValue("@sex", true); 
07 //第二種添加查詢參數的例子 
08 SqlParameter parameter = new SqlParameter("@age", SqlDbType.Int);//注意UserInfo表里age字段是int類型的 
09 parameter.Value = 30; 
10 command.Parameters.Add(parameter);//添加參數 
11 //實例化DataAdapter 
12 SqlDataAdapter adapter = new SqlDataAdapter(command); 
13 DataTable data = new DataTable();
#p#

上面的代碼是訪問SQL Server數據庫的代碼。如果本文中提到的數據分別在Access、MySQL、Oracle數據庫,那么對應的參數化SQL語句及參數分別如下:

數據庫 Access MySQL Oracle
 SQL語句 select * from UserInfo
where sex=? and age>?
select * from UserInfo
where sex=?sex and age>?age
select * from UserInfo
where sex=:sex and age>:age
參數 OleDbParameter MySqlParameter OracleParameter
實例化參數 OleDbParameter p=new OleDbParameter(“?”, OleDbType. Boolean); MySqlParameter p=new MySqlParameter(“?sex”, MySqlDbType.Bit); OracleParameter p=new OracleParameter(“:sex”, OracleType.Byte);
賦值 p.Value=true; p.Value=1; p.Value=1;

通過上面的實例代碼我們可以看出盡管SQL語句大體相似,但是在不同數據庫的特點,可能參數化SQL語句不同,例如在Access中參數化SQL語句是在參數直接以“?”作為參數名,在SQL Server中是參數有“@”前綴,在MySQL中是參數有“?”前綴,在Oracle中參數以“:”為前綴。
注意:因為在Access中參數名都是“?”,所以給參數賦值一定要按照列順序賦值,否則就有可能執行出錯。

Command對象傳參效率測試

在.net平臺,普通的insert語句有兩種寫法,不帶參數insert into test(c1,c2) values(var1,var2)和帶參數insert into test(c1,c2) values(:c1,:c2),它們的執行效率如何呢?
做了個試驗,代碼如下:(數據庫是oracle)

01 public partial class WebForm1 : System.Web.UI.Page
02     {
03         protected void Page_Load(object sender, EventArgs e)
04         {
05             //test1();
06             test2();
07         }
08         private void test1()
09         {
10             OracleConnection con = new OracleConnection();
11             con.ConnectionString = "Data Source=oracl;User Id=xxx;Password=xxx;Persist Security Info=True;";
12             System.Random r = new Random((int)System.DateTime.Now.Ticks);
13             string strCommand = "insert into test(c1,c2) values({0},{1})";
14             OracleCommand com = new OracleCommand();
15             com.Connection = con;
16             con.Open();
17             DateTime dt = DateTime.Now;
18             Label1.Text = "不傳參:"+DateTime.Now.ToLongTimeString();
19             for (int i = 0; i < 50000; i++)
20             {
21   
#p#
22                 com.CommandText = string.Format(strCommand, r.Next(), r.Next());
23                 com.ExecuteNonQuery();
24             }
25             com.CommandText = "truncate table test";
26             com.ExecuteNonQuery();
27             con.Close();
28             Label2.Text = DateTime.Now.ToLongTimeString();
29         }
30         private void test2()
31         {
32             OracleConnection con = new OracleConnection();
33   
34             con.ConnectionString = "Data Source=bocodb;User Id=hljyd;Password=hljyd;Persist Security Info=True;";
35             System.Random r = new Random((int)System.DateTime.Now.Ticks);
36             string strCommand = "insert into test(c1,c2) values(:c1,:c2)";
37             OracleCommand com = new OracleCommand();
38             com.Parameters.Add(":c1", OracleType.Number);
39             com.Parameters.Add(":c2", OracleType.Number);
40             com.CommandText = strCommand;
41             com.Connection = con;
42             con.Open();
43             Label1.Text = "傳參:"+DateTime.Now.ToLongTimeString();
44             for (int i = 0; i < 50000; i++)
45             {
46                 com.Parameters[":c1"].Value = r.Next();
47                 com.Parameters[":c2"].Value = r.Next();
48                   
49                 com.ExecuteNonQuery();
50             }
51             com.Parameters.Clear();
52             com.CommandText = "truncate table test";
53             com.ExecuteNonQuery();
54             con.Close();
55             Label2.Text = DateTime.Now.ToLongTimeString();
56         }
57     }

執行結果:
10000記錄:
不傳參數?5:46:19 15:46:34 15秒
傳參數:??5:50:51 15:51:01 10秒

50000記錄:
不傳參數  16:09:03 16:10:24 81秒
傳參數::16:15:43 16:16:36 53秒
這只是2個參數的情況,如果參數很多會不會影響更大呢?

10000記錄,7個參數:
不傳參數:17:11:01 17:11:18 17秒
傳參數:17:13:46 17:13:59 13秒
50000記錄:7個參數:
不傳參數:17:19:02 17:20:25 1分23秒
傳參數:17:15:09 17:16:10 1分1秒

需要相差不大,但是向command對象傳遞參數既可以避免sql注入問題,也可以提高性能。

 

【編輯推薦】

SQL中的分頁查詢語句介紹

批處理SQL語句的執行效率提高的方法

SQL語句中特殊字符的處理方法

教您用SQL語句進行模糊查詢

為您講解SQL動態語句的語法

責任編輯:段燃 來源: 互聯網
相關推薦

2010-09-25 11:02:33

SQL主鍵

2010-09-03 14:14:16

SQL刪除

2010-09-24 15:58:24

SQL語句逐條更新

2010-09-10 09:55:13

SQL參數變量

2010-09-24 16:52:18

sql DATENAM

2010-09-07 09:45:48

SQL語句

2010-09-07 15:54:47

SQL語句LIKE

2010-09-28 11:28:40

SQL字段屬性

2010-10-08 16:49:01

MySQL alter

2010-09-09 09:59:37

SQL函數TRUNC

2010-09-25 09:34:05

sql server主

2010-10-21 16:59:37

SQL Server創

2010-10-21 16:59:37

SQL Server創

2010-09-07 15:31:20

SQL語句事務

2010-09-10 16:24:06

SQL函數

2010-09-26 13:51:48

SQL游標

2010-09-14 13:22:51

sql server備

2010-09-26 13:56:43

SQL遠程查詢

2010-09-07 14:50:15

SQL語句

2010-10-27 17:04:41

Oracle動態查詢
點贊
收藏

51CTO技術棧公眾號

亚洲欧美大片| 日本美女一区| 亚洲日本乱码在线观看| 91.·福利| 久久综合伊人77777尤物| 成人动漫视频在线观看免费| 国产一级片在线| 精品久久久久99| 亚洲精品视频啊美女在线直播| 天天干在线影院| 综合激情国产一区| 国产成人综合自拍| 免费观看成人性生生活片| mm131午夜| 欧美精品一区二区三区在线| 蜜臀av亚洲一区中文字幕| av岛国在线| 久久久久久99| 国产精品日韩精品欧美精品| 永久免费的av网站| 不卡av电影院| av色综合久久天堂av综合| av影院在线免费观看| 欧美精品一区二区视频| 精品国产成人在线影院| 激情久久中文字幕| 成人免费在线电影| 国产91视觉| 欧美午夜精品久久久久久超碰| 国产成人啪午夜精品网站男同| 欧美成人免费在线观看视频| 成人av电影在线| 国产精品99久久久久久董美香 | av资源久久| 99热在线网站| 91九色国产在线| 亚洲成av人片一区二区梦乃| 欧美疯狂party性派对| 国产在线电影| av电影天堂一区二区在线观看| 91九色在线播放| 国产免费黄色小视频| 欧美激情一级欧美精品| 亚洲成人精品在线观看| 亚洲国产最新| 久久这里精品| 欧美午夜精品理论片a级大开眼界| 日韩欧美一区二区不卡| 成人教育av在线| 国产九一精品| 川上优av中文字幕一区二区| 一女二男3p波多野结衣| 精品免费国产| 久久综合久久88| 亚洲成av人片| 国内精品写真在线观看| 亚洲日本三级| 9191在线播放| 成人网18免费软件大全| 国内一区二区三区在线视频| 亚洲人成网站色ww在线| 国产精品私人影院| 国产在线播精品第三| 欧美三级黄美女| 国产精品极品国产中出| 日韩另类视频| www成人在线视频| 日本a级片久久久| 精品一区二区三区中文字幕| 日韩高清国产精品| 亚洲天堂av综合网| 国产精品免费丝袜| 99久久久久久中文字幕一区| 日韩三级影视基地| 久久久久久国产| 亚洲三级电影全部在线观看高清| 九七影院理伦片| 91久久夜色精品国产网站| 欧美一级免费大片| 成人国产电影网| 亚洲成人日韩| 国内精彩免费自拍视频在线观看网址| 亚洲精品高清无码视频| 99国产超薄丝袜足j在线观看| 欧美一二三四在线| 国产精品大尺度| 久久精品成人| 久久99国产精一区二区三区| 在线观看精品一区二区三区| 韩国日本美国免费毛片| 岛国视频一区免费观看| 最近更新的2019中文字幕| 欧美在线一区二区| 国产午夜精品理论片a级大结局 | 欧美日韩国产一级片| 国产精品视频第一区| 美女视频免费一区| 欧美成人自拍| 日本一区影院| 粉嫩av一区二区三区四区五区| 九色蝌蚪在线| 国产激情99| 色播五月综合网| 人妻互换免费中文字幕| 亚洲欧美丝袜| 欧美一区免费视频| 国产精品美女久久久久av福利| 国产精品高潮呻吟久久av野狼 | 99精品小视频| 国产乱码精品一区二区亚洲| 亚洲国产欧洲综合997久久| 久久久久www| 亚洲午夜未删减在线观看 | 国产黄色一级网站| bt天堂新版中文在线地址| 翔田千里亚洲一二三区| 蜜桃视频成人| 日韩在线电影一区| 日韩欧美一区二区在线观看| 日本精品国语自产拍在线观看| 国产日韩三区| 国产chinese精品一区二区| 91精品国产一区二区三区动漫| 韩日午夜在线资源一区二区| 91久久精品美女| 欧美中日韩免费视频| 亚洲欧洲在线一区| 在线不卡视频一区二区| 欧美黑人又粗又大又爽免费| 激情av网站| 在线免费看黄网站| 黄网av在线| 任你弄精品视频免费观看| 伊人久久大香线| 国产一本一道久久香蕉| 亚洲激情成人在线| 91精品视频网| 欧美精品在线极品| 成人黄色在线播放| 欧美a级黄色大片| 一本大道香蕉8中文在线视频| 三级福利片在线观看| 精品中文字幕一区二区三区| 国产人妖ts一区二区| 在线亚洲观看| 国产精品白丝jk白祙喷水网站 | 成人短剧在线观看| 调教一区二区| 天海翼精品一区二区三区| 久久99久久久久久久久久久| 国产精品欧美久久久久无广告| 欧美一级日韩不卡播放免费| 最近2019中文字幕一页二页| 国产精品自拍小视频| 影音先锋电影在线观看| 免费成人动漫| 好吊视频一区二区三区四区| 久久久一区二区三区| 欧美日韩亚洲91| 日韩欧美在线1卡| 日本综合视频| 久草精品视频| av男人天堂一区| 在线不卡中文字幕播放| 国色天香2019中文字幕在线观看| 先锋影音日韩| 高清美女视频一区| 红桃视频在线观看一区二区| 国产毛片精品视频| 欧美一区二区精品久久911| 日韩免费中文字幕| 丰满少妇大力进入| 日韩制服诱惑| 青青草免费在线视频| 日日av拍夜夜添久久免费| 乱码第一页成人| 欧美成人精品1314www| 国产久一道中文一区| 1pondo在线播放免费| 亚洲综合社区| 日韩欧美的一区| 特级西西444www大精品视频| 18加网站在线| 美女脱光内衣内裤视频久久影院| 91精品婷婷国产综合久久| 色综合影院在线观看| 少妇在线看www| 国产一区二区免费在线| 美女福利精品视频| 欧美h版电影| 99久久婷婷国产综合精品电影√| 狠狠操狠狠色综合网| 日本不卡高清视频一区| 欧美va在线观看| 99免费精品在线| 日本a级片电影一区二区| 日本福利片在线| 国产精品一区二区三区99| 国产精品久久久久久久9999| 国产精品免费播放|