C#中SqlParameter的作用與用法
一般來說,在更新DataTable或是DataSet時,如果不採用SqlParameter,那麼當輸入的Sql語句出現歧義時,如字串中含有單引號,程式就會發生錯誤,並且他人可以輕易地通過拼接Sql語句來進行注入攻擊。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
string sql
= "update
Table1 set name = 'Pudding' where ID = '1'" ; //未採用SqlParameter SqlConnection
conn = new SqlConnection(); conn.ConnectionString
= "Data
Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true" ; //連線字串與資料庫有關 SqlCommand
cmd = new SqlCommand(sql,
conn); try { conn.Open(); return (cmd.ExecuteNonQuery()); } catch (Exception) { return -1; throw ; } finally { conn.Close(); } |
上述程式碼未採用SqlParameter,除了存在安全性問題,該方法還無法解決二進位制流的更新,如圖片檔案。通過使用SqlParameter可以解決上述問題,常見的使用方法有兩種,Add方法和AddRange方法。
一、Add方法
1
2
3
4
|
SqlParameter
sp = new SqlParameter( "@name" , "Pudding" ); cmd.Parameters.Add(sp); sp
= new SqlParameter( "@ID" , "1" ); cmd.Parameters.Add(sp); |
該方法每次只能新增一個SqlParameter。上述程式碼的功能是將ID值等於1的欄位name更新為Pudding(人名)。
二、AddRange方法
1
2
|
SqlParameter[]
paras = new SqlParameter[]
{ new SqlParameter( "@name" , "Pudding" ), new SqlParameter( "@ID" , "1" )
}; cmd.Parameters.AddRange(paras); |
顯然,Add方法在新增多個SqlParameter時不方便,此時,可以採用AddRange方法。
下面是通過SqlParameter向資料庫儲存及讀取圖片的程式碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
public int SavePhoto( string photourl) { FileStream
fs = new FileStream(photourl,
FileMode.Open, FileAccess.Read); //建立FileStream物件,用於向BinaryReader寫入位元組資料流 BinaryReader
br = new BinaryReader(fs); //建立BinaryReader物件,用於寫入下面的byte陣列 byte []
photo = br.ReadBytes(( int )fs.Length); //新建byte陣列,寫入br中的資料 br.Close(); //記得要關閉br fs.Close(); //還有fs string sql
= "update
Table1 set photo = @photo where ID = '0'" ; SqlConnection
conn = new SqlConnection(); conn.ConnectionString
= "Data
Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true" ; SqlCommand
cmd = new SqlCommand(sql,
conn); SqlParameter
sp = new SqlParameter( "@photo" ,
photo); cmd.Parameters.Add(sp); try { conn.Open(); return (cmd.ExecuteNonQuery()); } catch (Exception) { return -1; throw ; } finally { conn.Close(); } } public void ReadPhoto( string url) { string sql
= "select
photo from Table1 where ID = '0'" ; SqlConnection
conn = new SqlConnection(); conn.ConnectionString
= "Data
Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true" ; SqlCommand
cmd = new SqlCommand(sql,
conn); try { conn.Open(); SqlDataReader
reader = cmd.ExecuteReader(); //採用SqlDataReader的方法來讀取資料 if (reader.Read()) { byte []
photo = reader[0] as byte []; //將第0列的資料寫入byte陣列 FileStream
fs = new FileStream(url,FileMode.CreateNew);建立FileStream物件,用於寫入位元組資料流 fs.Write(photo,0,photo.Length); //將byte陣列中的資料寫入fs fs.Close(); //關閉fs } reader.Close(); //關閉reader } catch (Exception
ex) { throw ; } finally { conn.Close(); } } } |
相關文章
- SqlParameter的用法SQL
- C#中Thread.Sleep()的作用及用法C#thread
- C#中#region,#if的作用C#
- C#中Enum的用法C#
- C#中substring ()的用法C#
- C#中Attributes的用法C#
- C#中?和??及?:的用法C#
- inline內聯的用法與作用inline
- C#中dynamic的正確用法C#
- C#中 as is 用法筆記C#筆記
- maven中profile元素的作用意義和用法Maven
- js中的||與&&用法JS
- 【轉】C#中dynamic的正確用法C#
- C#中File 類的用法 轉載C#
- C#中yield return用法分析C#
- C#中DllImport用法彙總C#Import
- 關於C#中async/await的用法C#AI
- C# 中的 Mutex(互斥體)基礎用法C#Mutex
- Hive的基本操作用法Hive
- System.ArgumentException: 另一個SqlParameterCollection中已包含SqlParameter。ExceptionSQL
- Java中static變數作用和用法詳解Java變數
- C# ArrayList的用法C#
- C# peek()的用法C#
- c#物件導向中的get和set的用法C#物件
- Vue中scoped與CSSModules的用法VueCSSSSM
- C#中continue、return、break的區別及作用C#
- echo命令在Unix中的作用以及其常見用法?
- 淺析Java中的雜湊值HashCode的作用及用法Java
- Git 的日常工作用法Git
- sql語句中as的用法和作用SQL
- C++引用的作用和用法C++
- 【轉】C#中base關鍵字的幾種用法C#
- .net 6 C#中System.IO.Path類的用法C#
- C#中Finally的一個不太常見的用法C#
- C#裡List的用法C#
- js中!和!!的區別與用法JS
- c# get_type與typeof方法的區別與聯絡和作用C#
- C#中JavaScriptSerializer幫助類用法例項C#JavaScript