探秘不同尋常的ADO.NET參數介紹
在ADO.NET參數中經常需要跟各種數據庫打交道,在不實用存儲過程的情況下,使用參數化SQL語句一定程度上可以防止SQL注入,同時對一些較難賦值的字段使用參數化SQL語句很容易就能賦值。
所以本人經常在ADO.NET參數化SQL語句,近幾年來陸續跟SQL Server/Oracle/ MySQL/Access打交道,積累了一些心得,現在整理出來供大家參考。我們假設數據可的結構如下圖(設置的數據庫為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之外,操作其它數據庫可以不必要按照參數在SQL語句中出現的順序添加進去一樣可以正確執行,但是在Access中一定按照插入的列的順序添加參數,因為“OLE DB.NET Framework 數據提供程序使用標有問號 (?) 的定位參數,而不使用命名參數(MSDN)”,所以給添加參數和賦值一定要按照列的順序。
通過上面的例子,基本上可以總結出一個規律:在參數化SQL中參數名的格式跟其在存儲過程中生命存儲過程參數一致,例如在Oracle中存儲過程參數一律以”:”開頭,在MS SQL Server中存儲過程參數一律以”@”開頭,而在MySQL中存儲過程(MySQL從5.0以后版本支持存儲過程)參數一律以“?#t#
”開頭,所以在參數化SQL語句中參數名有些不一樣(記得在csdn上有朋友提到過不知道為什么MySQL中參數化SQL語句中要用“?”而不是和SQL Server一樣使用”@”),如果那位朋友看過本文,我想他就會解開這個疑慮了。