日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
教您使用參數(shù)化SQL語(yǔ)句

SQL語(yǔ)句的使用非常靈活,通過各種SQL語(yǔ)句,可以實(shí)現(xiàn)不同功能的操作,下面將為您介紹參數(shù)化SQL語(yǔ)句,供您參考,希望對(duì)您有所幫助。

察哈爾右翼后網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

SQL注入的方法有兩種:

一是所有的SQL語(yǔ)句都存放在存儲(chǔ)過程中,這樣不但可以避免SQL注入,還能提高一些性能,并且存儲(chǔ)過程可以由專門的數(shù)據(jù)庫(kù)管理員(DBA)編寫和集中管理,不過這種做法有時(shí)候針對(duì)相同的幾個(gè)表有不同條件的查詢,SQL語(yǔ)句可能不同,這樣就會(huì)編寫大量的存儲(chǔ)過程,所以有人提出了第二種方案:參數(shù)化SQL語(yǔ)句。例如我們?cè)诒酒袆?chuàng)建的表UserInfo中查找所有女性用戶,那么通常情況下我們的SQL語(yǔ)句可能是這樣:

1select * from UserInfo where sex=0

在參數(shù)化SQL語(yǔ)句中我們將數(shù)值以參數(shù)化的形式提供,對(duì)于上面的查詢,我們用參數(shù)化SQL語(yǔ)句表示為: 

1select * from UserInfo where sex=@sex

再對(duì)代碼中對(duì)這個(gè)SQL語(yǔ)句中的參數(shù)進(jìn)行賦值,假如我們要查找UserInfo表中所有年齡大于30歲的男性用戶,這個(gè)參數(shù)化SQL語(yǔ)句可以這么寫:

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

下面是執(zhí)行這個(gè)查詢并且將查詢結(jié)果集以DataTable的方式返回的代碼: 

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

#p#

上面的代碼是訪問SQL Server數(shù)據(jù)庫(kù)的代碼。如果本文中提到的數(shù)據(jù)分別在Access、MySQL、Oracle數(shù)據(jù)庫(kù),那么對(duì)應(yīng)的參數(shù)化SQL語(yǔ)句及參數(shù)分別如下:

數(shù)據(jù)庫(kù)AccessMySQLOracle
 SQL語(yǔ)句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
參數(shù)OleDbParameterMySqlParameterOracleParameter
實(shí)例化參數(shù)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;

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

Command對(duì)象傳參效率測(cè)試

在.net平臺(tái),普通的insert語(yǔ)句有兩種寫法,不帶參數(shù)insert into test(c1,c2) values(var1,var2)和帶參數(shù)insert into test(c1,c2) values(:c1,:c2),它們的執(zhí)行效率如何呢?
做了個(gè)試驗(yàn),代碼如下:(數(shù)據(jù)庫(kù)是oracle)

01public 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    }

執(zhí)行結(jié)果:
10000記錄:
不傳參數(shù)?5:46:19 15:46:34 15秒
傳參數(shù):??5:50:51 15:51:01 10秒

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

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

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

【編輯推薦】

SQL中的分頁(yè)查詢語(yǔ)句介紹

批處理SQL語(yǔ)句的執(zhí)行效率提高的方法

SQL語(yǔ)句中特殊字符的處理方法

教您用SQL語(yǔ)句進(jìn)行模糊查詢

為您講解SQL動(dòng)態(tài)語(yǔ)句的語(yǔ)法


標(biāo)題名稱:教您使用參數(shù)化SQL語(yǔ)句
當(dāng)前鏈接:http://www.dlmjj.cn/article/dhijghc.html