1. 程式人生 > >在ADO.NET中使用引數化SQL語句的大同小異

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

在ADO.NET中經常需要跟各種資料庫打交道,在不實用儲存過程的情況下,使用引數化SQL語句一定程度上可以防止SQL注入,同時對一些較難賦值的欄位(如在SQL Server中Image欄位,在Oracle中Clob欄位等)使用引數化SQL語句很容易就能賦值,所以本人經常在ADO.NET中使用引數化SQL語句,近幾年來陸續跟SQL Server/Oracle/ MySQL/Access打交道,積累了一些心得,現在整理出來供大家參考。

我們假設資料可的結構如下圖(設定的資料庫為Oracle10g):

它在SQL Server中的建立語句是:
 

create table S_Admin (
   UserName             varchar
(60)          not null,
   Password             varchar(60)          not null,
   Remark               varchar(50)          null,
   Mail                 varchar(120)         not null,
   AddDate              datetime             null default GETDATE(),
   LoginDate            datetime             null default
 GETDATE(),
   LoginIP              varchar(50)          null,
   Active               smallint             null default 1,
   LoginCount           int                  null default 1,
   Power                int                  null default 0,
   Departid             int                  null default
 0,
   constraint PK_S_ADMIN primary key nonclustered (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;

///<summary>/// 在Oracle中使用引數化SQL的例子
/// 程式碼編寫:周公
/// 日期:2008-3-19
///
///
</summary>public class OracleUtil
{
    public OracleUtil()
    {
        
    }

    public bool 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;

///<summary>/// 在MySQL中使用引數化SQL的例子
/// 程式碼編寫:周公
/// 日期:2008-3-19
/// 發表網址:
///
</summary>public class MySqlUtil
{
    public MySqlUtil()
    {
        
    }

    public bool 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;

///<summary>/// 在SQL Server中使用引數化SQL的例子
/// 程式碼編寫:周公
/// 日期:2008-3-19
//////</summary>public class SqlUtil
{
    public SqlUtil()
    {
        
    }

    public bool 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;

///<summary>/// 在Access中使用引數化SQL的例子
/// 程式碼編寫:周公
/// 日期:2008-3-19
/// 發表網址:///</summary>public class AccessUtil
{
    public AccessUtil()
    {
        
    }

    public bool 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 = "";//此處設定連結字串
        
//注意下面引數的順序一定要按照sql語句中的插入的列的順序賦值,否則一定會報異常        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中儲存過程(MySQL5.0以後版本支援儲存過程)引數一律以“?”開頭,所以在引數化SQL語句中引數名有些不一樣(記得在csdn上有朋友提到過不知道為什麼MySQL中引數化SQL語句中要用“?而不是和SQL Server一樣使用”@”),如果那位朋友看過本文,我想他就會解開這個疑慮了。

相關推薦

ADO.NET(四) 引數sql和簡單的 增刪改查

 ExecuteScalar()方法通過SELECT語句返回查詢結果中的第一行第一列的值,該方法常用於執行返回單個欄位的 查詢,如count(),max()等。 ExecuteNonQuery()方法執行返回結果集的命令,如insert delete update。這個方法

Oracle 引數SQL 語句 寫法

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

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

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

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

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

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

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

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

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

ASP.NET引數查詢

一、引數化查詢原理 在使用引數化查詢的情況下,資料庫伺服器不會將引數的內容視為SQL指令的一部份來處理,而是在資料庫完成 SQL指令的編譯後,才套用引數執行,因此就算引數中含有惡意的指令,由於已經編譯完成,就不會被資料庫所執行。 有部份的開發人員可能會認為使用引數化查詢,

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

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

使用ADO.NET執行帶引數Sql語句

不帶引數的SQL語句 過載通用Update方法 /// <summary> /// 執行增、刪、改 (帶引數的SQL語句) /// <

ado.net EF與ado.net區別比較、在EF使用執行sql語句

ado.net EF作為微軟的一個ORM框架,通過實體、關係型資料庫表之間的對映,使開發人員可以通過操作表實體而間接的操作資料庫,大大的提高了開發效率。 這樣一來,.net平臺下,我們與底層資料庫的互動就有兩種選擇了(這句話說得不是很準確,微軟.net 框架下還是有其他的O

ADO.NET SQL Server可以插入含多個SQL語句的批處理腳本,但是用MySQL的ODBC驅動不行

.org 方便 8.0 star man date mys 進行 ror 眾所周知,我們在ADO.NET中可以使用NuGet包System.Data.SqlClient來操作SQL Server,並且ADO.NET是支持向SQL Server發送包含多個SQL語句的批處理腳

ADO.NET】7、SQL高級封裝

cal reat title urn clear itl [] esc 存儲 public static string str = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

在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、概述

在.net序列讀寫xml方法的總結

port 單詞 創建 padding 在一起 sys base msd 屏幕 在.net中序列化讀寫xml方法的總結 閱讀目錄 開始 最簡單的使用XML的方法 類型定義與XML結構的映射 使用 XmlElement 使用 XmlAttribute 使用 Inner

存儲過程執行動態Sql語句

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

項目常用的SQL語句

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

ADO.NET的存儲過程封裝

c# ado.net sql存儲過程 //獲取連接字符串 private static readonly string ConnectionString=ConfigurationManager.["connectionString"].ConnectionString;//執行增刪改的存儲過程p

[轉載]ADO.NET的五個主要對象

reader 而已 net 一次 tar com 行數 當我 命令 Connection:主要是開啟程序和數據庫之間的連接。沒有利用連接對象將數據庫打開,是無法從數據庫中取得數據的。Close和Dispose的區別,Close以後還可以Open,Dispose以後則不能再用

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

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