探秘不同尋常的ADO.NET參數(shù)介紹
在ADO.NET參數(shù)中經(jīng)常需要跟各種數(shù)據(jù)庫打交道,在不實用存儲過程的情況下,使用參數(shù)化SQL語句一定程度上可以防止SQL注入,同時對一些較難賦值的字段使用參數(shù)化SQL語句很容易就能賦值。
所以本人經(jīng)常在ADO.NET參數(shù)化SQL語句,近幾年來陸續(xù)跟SQL Server/Oracle/ MySQL/Access打交道,積累了一些心得,現(xiàn)在整理出來供大家參考。我們假設(shè)數(shù)據(jù)可的結(jié)構(gòu)如下圖(設(shè)置的數(shù)據(jù)庫為Oracle10g):
- create table S_Admin (
- UserName varchar(60) not null,
- Password varchar(60) not null,
- Remarkvarchar(50) null,
- Mail varchar(120)not null,
- AddDate datetime null default GETDATE(),
- LoginDatedatetime null default GETDATE(),
- LoginIP varchar(50) null,
- Activesmallint null default 1,
- LoginCount intnull default 1,
- Power intnull default 0,
- Departid intnull default 0,
- constraint PK_S_ADMIN primary key nonclustered (UserId)
- )
- go
需要說明的是,除了Access之外,操作其它數(shù)據(jù)庫可以不必要按照參數(shù)在SQL語句中出現(xiàn)的順序添加進去一樣可以正確執(zhí)行,但是在Access中一定按照插入的列的順序添加參數(shù),因為“OLE DB.NET Framework 數(shù)據(jù)提供程序使用標有問號 (?) 的定位參數(shù),而不使用命名參數(shù)(MSDN)”,所以給添加參數(shù)和賦值一定要按照列的順序。
通過上面的例子,基本上可以總結(jié)出一個規(guī)律:在參數(shù)化SQL中參數(shù)名的格式跟其在存儲過程中生命存儲過程參數(shù)一致,例如在Oracle中存儲過程參數(shù)一律以”:”開頭,在MS SQL Server中存儲過程參數(shù)一律以”@”開頭,而在MySQL中存儲過程(MySQL從5.0以后版本支持存儲過程)參數(shù)一律以“?#t#
”開頭,所以在參數(shù)化SQL語句中參數(shù)名有些不一樣(記得在csdn上有朋友提到過不知道為什么MySQL中參數(shù)化SQL語句中要用“?”而不是和SQL Server一樣使用”@”),如果那位朋友看過本文,我想他就會解開這個疑慮了。