簡述ADO中如何使用引數化的命令物件以及增刪改查,儲存過程的操作
阿新 • • 發佈:2018-12-21
連線資料庫程式碼:
private SqlConnection con = null; public void OpenConnection(string connectionString) { con = new SqlConnection(); con.ConnectionString = connectionString; con.Open(); } public void CloseConnection() { con.Close(); }
新增程式碼(增)
public void InsertPerson(string name, int age) { string sql = string.Format("insert into Person(Name,Age) values ('{0}',{1})", name, age); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { cmd.ExecuteNonQuery(); } }
這個方法在語法上沒有問題,但你可以提供一個過載版本,允許呼叫者傳遞一個表示行資料的強型別類。
public void InsertPerson(Person p) { string sql = string.Format("insert into Person(Name,Age) values ('{0}',{1})", p.Name, p.Age); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { cmd.ExecuteNonQuery(); } }
刪除程式碼(刪)
public void DeletePerson(int id) { string sql = string.Format("Delete form Person where id={0}",id); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { try { cmd.ExecuteNonQuery(); } catch (Exception) { Console.WriteLine("刪除失敗"); } } }
修改程式碼(改)
public void UpdatePerson(int id,string name) { string sql = string.Format("Update Person set name={0} where id={1}", name,id); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { try { cmd.ExecuteNonQuery(); } catch (Exception) { Console.WriteLine("更新失敗"); } } }
查詢程式碼(查)
public List<Person> GetAllPersonList() { List<Person> list = new List<Person>(); string sql = string.Format("select * from Person"); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { SqlDataReader sr = cmd.ExecuteReader(); while (sr.Read()) { list.Add(new Person { Age=(int)sr["Age"], Name=(string)sr["Name"] }); } } return list; }
還有另一種返回System.Data.DataTable物件的方法,它實際上是ADO.NET非連線層的一部分
public DataTable GetAllPersonDataTable() { DataTable dr = new DataTable(); string sql = string.Format("select * from Person"); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { SqlDataReader sr = cmd.ExecuteReader(); dr.Load(sr); sr.Close(); } return dr; }
使用引數化的命令物件
不使用引數化的命令物件每一個 SQL 查詢都是用字串字面量硬編碼的。參教化查詢能像物件那樣處理 SQL 引數,而不是像一堆文字一樣。而且.引數化查詢執行起來比純文字的 SQL 語句快多了,它只需要解析一次(而不是像 SQL 語句那樣每次被分配到CommandText 屬性都要解析)。同樣,引數化查詢也能消除 SQL 注人攻擊(非常著名的資料訪問安全問題)的隱患
為支援引數化查詢, ADO· NET命令物件使用一個集合來儲存引數物件。這個集合預設是空的.可以新增任意多的引數物件並對映到SQL語句中的佔位符引數。如果需要把 SQL 查詢中的引數和命令物件引數集合中某一個成員關聯的話,只需要在SQL文字引數前面加@符號(微軟SQL Server是這樣的,不是所有的DBMS都支援@符號)
DbParameter 型別的主要成員 | |
DbType | 從資料來源獲取或設定原始資料型別,以 CLR 資料型別呈現 |
Direction | 獲取或設定一個值,該值指示引數是隻可輸入、只可輸出、雙向還是返回值引數 |
IsNullable | 獲取或設定一個值,該值指示引數是否接受空值 |
ParameterName | 獲取或設定DbParameter的名稱 |
Size | 獲取或設定列中資料的最大尺寸 (只對文字資料有用) |
Value | 獲取或設定該引數的值 |
程式碼如下
public void InsertPersonPara(Person p) { string sql = string.Format("insert into Person(Name,Age) values (@Name,@Age)"); using (SqlCommand cmd = new SqlCommand(sql, this.con)) { SqlParameter param = new SqlParameter(); param.ParameterName = "@Name"; param.Value = p.Name; param.SqlDbType = SqlDbType.Char; cmd.Parameters.Add(param); param=new SqlParameter(); param.ParameterName = "@Age"; param.Value = p.Age; param.SqlDbType = SqlDbType.Int; cmd.Parameters.Add(param); }
同樣,注意SQL查詢包含2個嵌入的佔位符,每一個都以@為字首。使用 SqlParamter 型別,我們就可以使用 param.ParameterName屬性以強型別格式來對映每一個佔位符並指定各種細節(值、資料型別和大小等)。引數物件都準備好之後.就可以通過呼叫 Add()方法加到命令物件的集合中。
執行儲存過程
儲存過程是儲存在資料庫內的一段已命名的SQL程式碼,你可以構造儲存過程,返回一組行或標量資料型別,或進行其他有意義的處理(如插入、更新、刪除),也可以接受一些可選引數。其實它就像是一個儲存在資料庫內的功能模組,和那些二進位制資料物件有明顯區別;
public string LookUpPetName(int id) { string petName = string.Empty; using (SqlCommand cmd=new SqlCommand("GetPetName",this.con)) { cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param.ParameterName = "@Id"; param.Value = id; param.SqlDbType = SqlDbType.Int; param.Direction = ParameterDirection.Input; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Name"; param.SqlDbType = SqlDbType.Char; param.Size = 20; param.Direction = ParameterDirection.Output; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); petName = (string)cmd.Parameters["@Name"].Value; } return petName; }