1. 程式人生 > >不同資料庫在C#中使用引數化SQL語句的大同小異

不同資料庫在C#中使用引數化SQL語句的大同小異

在C#中經常需要跟各種資料庫打交道,在不實用儲存過程的情況下,使用引數化SQL語句一定程度上可以防止SQL注入,同時對一些較難賦值的欄位(如在SQL Server中Image欄位,在Oracle中Clob欄位等)使用引數化SQL語句很容易就能賦值,所以本人經常在ADO.NET中使用引數化SQL語句,近幾年來陸續跟SQL Server/Oracle/ MySQL/Access打交道,積累了一些心得,現在整理出來供大家參考。 createtable S_Admin (
   UserName             
varchar(60)          notnull,
   Password             
varchar(60)          notnull,
   Remark               
varchar(50)          null,
   Mail                 
varchar(120)         notnull,
   AddDate              
datetimenulldefaultGETDATE(),
   LoginDate            
datetimenulldefaultGETDATE(),
   LoginIP              
varchar(50)          null,
   Active               
smallintnulldefault1,
   LoginCount           
intnulldefault1,
   
Powerintnulldefault0,
   Departid             
intnulldefault0,
   
constraint PK_S_ADMIN primarykeynonclustered (UserId)
)
go 下面假設資料庫的主鍵都採用了資料庫的本地化技術解決了(例如在Access、SQL Server和MySQL中採用自增欄位,在Oracle中使用了sequence結合觸發器),假如在Oracle中向表中插入一記錄的程式碼如下:   using
 System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OracleClient;
publicclass OracleUtil
{
    
public OracleUtil()
    {
        
    }

    
publicbool InsertAdmin(string userName, string password, string remark, string mail, int departId, int power)
    {
        
string sql ="insert into S_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(:UserName,:Password,:Remark,:Mail,:DepartId,:Power)";
        OracleConnection connection 
=new OracleConnection();
        connection.ConnectionString 
="";//此處設定連結字串        OracleCommand command =new OracleCommand(sql, connection);
        command.Parameters.Add(
":UserName", OracleType.NVarChar, 60).Value = userName;
        command.Parameters.Add(
":Password", OracleType.NVarChar, 60).Value =password;
        command.Parameters.Add(
":Remark", OracleType.NVarChar, 60).Value = remark;
        command.Parameters.Add(
":Mail", OracleType.NVarChar, 60).Value =mail;
        command.Parameters.Add(
":DepartId", OracleType.Int32, 4).Value =departId;
        command.Parameters.Add(
":Power", OracleType.Int32, 4).Value = power;
        connection.Open();
        
int rowsAffected=command.ExecuteNonQuery();
        connection.Close();
        command.Dispose();
        
return rowsAffected >0;
    }
}
在MySQL中增加同樣一條記錄的程式碼如下(需要到MySQL官方網站下載.net驅動程式):   using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using MySql.Data;
using MySql.Data.MySqlClient;

publicclass MySqlUtil
{
    
public MySqlUtil()
    {
        
    }

    
publicbool InsertAdmin(string userName, string password, string remark, string mail, int departId, int power)
    {
        
string sql ="insert into S_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(?UserName,?Password,?Remark,?Mail,?DepartId,?Power)";
        MySqlConnection connection 
=new MySqlConnection();
        connection.ConnectionString 
="";//此處設定連結字串        MySqlCommand command =new MySqlCommand(sql, connection);
        command.Parameters.Add(
"?UserName", MySqlDbType.VarChar, 60).Value = userName;
        command.Parameters.Add(
"?Password", MySqlDbType.VarChar, 60).Value = password;
        command.Parameters.Add(
"?Remark", MySqlDbType.VarChar, 60).Value = remark;
        command.Parameters.Add(
"?Mail", MySqlDbType.VarChar, 60).Value = mail;
        command.Parameters.Add(
"?DepartId", MySqlDbType.Int32, 4).Value = departId;
        command.Parameters.Add(
"?Power", MySqlDbType.Int32, 4).Value = power;
        connection.Open();
        
int rowsAffected = command.ExecuteNonQuery();
        connection.Close();
        command.Dispose();
        
return rowsAffected >0;
    }
}
在SQL Server中增加同樣一條記錄的程式碼如下:   using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
publicclass SqlUtil
{
    
public SqlUtil()
    {
        
    }

    
publicbool InsertAdmin(string userName, string password, string remark, string mail, int departId, int power)
    {
        
string sql ="insert into S_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(@UserName,@Password,@Remark,@Mail,@DepartId,@Power)";
        SqlConnection connection 
=new SqlConnection();
        connection.ConnectionString 
="";//此處設定連結字串        SqlCommand command =new SqlCommand(sql, connection);
        command.Parameters.Add(
"@UserName",SqlDbType.NVarChar, 60).Value = userName;
        command.Parameters.Add(
"@Password", SqlDbType.NVarChar, 60).Value = password;
        command.Parameters.Add(
"@Remark", SqlDbType.NVarChar, 60).Value = remark;
        command.Parameters.Add(
"@Mail", SqlDbType.NVarChar, 60).Value = mail;
        command.Parameters.Add(
"@DepartId", SqlDbType.Int, 4).Value = departId;
        command.Parameters.Add(
"@Power", SqlDbType.Int, 4).Value = power;
        connection.Open();
        
int rowsAffected = command.ExecuteNonQuery();
        connection.Close();
        command.Dispose();
        
return rowsAffected >0;
    }
}
在Access中增加同樣一條記錄的程式碼如下:   using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
publicclass AccessUtil
{
    
public AccessUtil()
    {
        
    }

    
publicbool InsertAdmin(string userName, string password, string remark, string mail, int departId, int power)
    {
        
string sql ="insert into S_Admin(UserName,Password,Remark,Mail,DepartId,Power)values(?,?,?,?,?,?)";
        OleDbConnection connection 
=new OleDbConnection();
        connection.ConnectionString 
="";//此處設定連結字串        OleDbCommand command =new OleDbCommand(sql, connection);
        command.Parameters.Add(
"?", OleDbType.LongVarWChar, 60).Value = userName;
        command.Parameters.Add(
"?", OleDbType.LongVarWChar, 60).Value = password;
        command.Parameters.Add(
"?", OleDbType.LongVarWChar, 60).Value = remark;
        command.Parameters.Add(
"?", OleDbType.LongVarWChar, 60).Value = mail;
        command.Parameters.Add(
"?", OleDbType.Integer, 4).Value = departId;
        command.Parameters.Add(
"?", OleDbType.Integer, 4).Value = power;
        connection.Open();
        
int rowsAffected = command.ExecuteNonQuery();
        connection.Close();
        command.Dispose();
        
return rowsAffected >0;
    }
}
需要說明的是,除了Access之外,操作其它資料庫可以不必要按照引數在SQL語句中出現的順序新增進去一樣可以正確執行,但是在Access中一定按照插入的列的順序新增引數,因為“OLE DB.NET Framework 資料提供程式使用標有問號 (?) 的定位引數,而不使用命名引數(MSDN)”,所以給新增引數和賦值一定要按照列的順序。 通過上面的例子,基本上可以總結出一個規律:在引數化SQL中引數名的格式跟其在儲存過程中生命儲存過程引數一致,例如在Oracle中儲存過程引數一律以”:”開頭,在MS SQL Server中儲存過程引數一律以”@”開頭,而在MySQL中儲存過程(MySQL從5.0以後版本支援儲存過程)引數一律以“?”開頭,所以在引數化SQL語句中引數名有些不一樣(記得在csdn上有朋友提到過不知道為什麼MySQL中引數化SQL語句中要用“?”而不是和SQL Server一樣使用”@”),如果那位朋友看過本文,我想他就會解開這個疑慮了。

相關推薦

C# 使用引數SQL語句(防SQL注入攻擊)

“SQL注入攻擊”問題。我們在程式中存在著大量拼接產生SQL語句的程式碼,這就會導致一個比較大的安全隱患,容易遭受SQL注入攻擊。我們在程式碼中用的SQL語句是: string sqlStr = "select * from [Users] where User

Oracle 引數SQL 語句 寫法

OleDbParameter [] opGroup={new OleDbParameter(":sELEMENT_VALUE",OleDbType.VarChar),new OleDbParameter(":sFACTORY_ID",OleDbType.Integer),

不同資料庫C#使用引數SQL語句大同小異

在C#中經常需要跟各種資料庫打交道,在不實用儲存過程的情況下,使用引數化SQL語句一定程度上可以防止SQL注入,同時對一些較難賦值的欄位(如在SQL Server中Image欄位,在Oracle中Clob欄位等)使用引數化SQL語句很容易就能賦值,所以本人經常在ADO.NE

在ADO.NET使用引數SQL語句大同小異

在ADO.NET中經常需要跟各種資料庫打交道,在不實用儲存過程的情況下,使用引數化SQL語句一定程度上可以防止SQL注入,同時對一些較難賦值的欄位(如在SQL Server中Image欄位,在Oracle中Clob欄位等)使用引數化SQL語句很容易就能賦值,所以本人經常在ADO.NET中使用引數化SQL

ASP.NET引數SQL語句(SQL SERVER)

設計專案時,為了防止SQL注入,有很多種方法,一種是通過編寫儲存過程來防止SQL注入,使用這種方法可以提高效能,但是對於查詢語句可能存在多種不同的SQL語句,這就要編寫很多儲存過程,還有一種方法是通過引數化,在這裡只介紹一下SQL SERVER的。 先來介紹查詢: 普通的查詢語句(未將密

C#使用引數和塊語句來提高批處理SQL語句的執行效率

 當你的專案要求你的程式對高達幾萬條的資料在集中的時間內執行固定序列的操作,且不能完全使用儲存過程時而需要使用程式來執行時。會需要這些優化。    我們知道,SQL伺服器對一條語句的執行,需要分析、編譯、執行這些步驟,通過引數化我們可以對一種命令只分析和編譯一次,而執行多次

VS2013使用MySQL資料庫,資料集中如何填充帶引數sql語句

本人在網上查詢一番後,發現均無法實現效果,之前的專案使用Oracle,sql傳參類似“......where id = :id”,然後突然想到直接tableAdapter裡面新建一個update查詢,不就知道使用MySQL資料庫時sql傳參了嘛。以上思路,下給例子:

c#將變數嵌入SQL語句

1、使用 ' " +    + " ' 拼接 string mysql = " SELECT Cname,Grade FROM student,score,course WHERE student.Sno = score.Sno

[程式碼例項][C語言][sqlite3]用SQL語句查詢資料庫的例項

下載sqlite3原始碼 編譯安裝sqlite3的Makefile INSTALL_PATH =/usr/local all: install libsqlite3.so: sqlite3.c sqlite3.h gcc -shared -fPIC

資料庫常用的sql語句

SQL是目前使用最為廣泛的資料庫語言之一。這裡,我總結了在資料庫上,用SQL語言對資料排序、過濾和分組,以及表、檢視、聯結、子查詢、遊標、儲存過程和觸發器等內容。 1.檢索資料 SELECT prod

應聘常用的SQL語句資料庫知識必殺)一共50個

Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cname,T#) 課程表 SC(S#,C#,score) 成績表 Teacher(T#,Tname) 教師表 問題: 1、查詢“001”課程比“002”課程成績高的所有學生的學號; select a.S# fro

Django 直接使用sql語句 操作資料庫

在django中要直接使用sql操作資料庫,官方提供了兩種方式 1、使用 Manager.raw(raw_query, params=None, translations=None) 使用方法:

C# 引數SQL

引數化查詢(Parameterized Query 或 Parameterized Statement)是指在設計與資料庫連結並訪問資料時,在需要填入數值或資料的地方,使用引數 (Parameter)

在hibernate框架配置顯示sql語句

per 控制 col property hiberna color sql 輸出 最好 使用Hibernate的框架開發時,可在Hibernate.cfg.xml中加上 <property name="hibernate.show_sql">true<

SQL Server常用的SQL語句

計算 del pri arch 實體完整性 比較 完整 where子句 enc 1、概述 2、查詢概述 3、單表查詢 4、連接查詢 5、帶有exists的相關子查詢 6、SQL的集合操作 7、插入操作 8、刪除操作 9、修改操作 10、數據定義 11、視圖 1、概述

存儲過程執行動態Sql語句

查詢 需要 一點 定義 data 復制 ast 我們 臨時   在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXE

項目常用的SQL語句

升序 插入 top style 之前 span tro 刪除 union 摘要: 對於像我一樣的菜鳥級別人物來說,接觸的項目比較少,平常做的那些練習,包括三層中,一般也只能用到增刪改查,當然這些增刪改查語句是學數據庫語句的入門,在百度上搜索一大堆,w3cschool中幫助文

C#代碼驗證sql語句是否正確(只驗證不執行sql)的方法

sql查詢 noexec 檢測 方法 public pos 代碼 編譯 返回 轉自 :http://www.jquerycn.cn/a_15010 為大家介紹如何用C#驗證sql語句的正確性,就像sql查詢分析器中的檢測代碼功能一樣,有需要的朋友,可以參考下。 需要用到如下

在程序開發怎樣寫SQL語句可以提高數據庫的性能

也會 temp block 有意義 oltp 聚集索引 掃描方式 主鍵 減少 以下內容是公司dba總結。 1、 首先要搞明白什麽叫執行計劃? 執行計劃是數據庫根據SQL語句和相關表的統計信息作出的一個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條SQL語句如

ADO.NET復習總結(3)--參數SQL語句

輸入 net connect varchar 學生表 sap style text 執行過程 1、SQL 註入 2、使用參數化的方式,可以有效防止SQL註入,使用類parameter的實現類SqlParameter Command的屬性parameters是一個