1. 程式人生 > >簡述ADO中如何使用引數化的命令物件以及增刪改查,儲存過程的操作

簡述ADO中如何使用引數化的命令物件以及增刪改查,儲存過程的操作

連線資料庫程式碼:

  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;
        }