SqlDataAdapter類


SqlDataAdapter類常用操作

  SqlDataAdapter常用於從數據庫中返回一個結果集時。

  常用操作:

  Fill();

  示例:

        static void Main(string[] args)
        {
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";
            SqlConnection conn = new SqlConnection(str);    
            string strSql = "SELECT * FROM Person";
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
            da.TableMappings.Add("Table","Person");     //指定原表數據與DataTable的映射關系
            da.Fill(ds,"Person");           //將數據填充到指定的DataTable
   
            foreach (DataRow dr in ds.Tables["Person"].Rows)
            {
                Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString());
            }

            //當然也可以直接Fill,DataTable
            DataTable dt = new DataTable();
            da.Fill(dt);        //當然Fill兩次這里會有問題
            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString());
            }

            Console.ReadKey();
        }

  1、多次開啟關閉連接的問題

  也許我們已經留意到,使用SqlDataAdapter 不需要打開和關閉數據庫連接。如果調用SqlDataAdapter的Fill方法,並且其SelectCommand屬性的SqlConnection是關閉狀態,則SqlDataAdapter會自動打開它,然后提交查詢,獲取結果,最后關閉連接。如果在調用Fill方法前,SqlConnection是打開的,則查詢執行完畢后,SqlConnection 還將是打開的,也就是說SqlDataAdapter會保證SqlConnection的狀態恢復到原來的情形。
  看來SqlDataAdapter還是非常人性化的。但是這樣會產生一個問題。假如數據庫連接原本是關閉的,在查詢的時候並沒有打開,而直接Fill了兩次,這樣會導致數據庫連接被打開和關閉了兩次。這樣是會影響效率的。在調用Fill時各打開和關閉了一次。
  為了避免多次打開和關閉數據庫連接,我們可以這樣:

  cn.Open();
  da.Fill(ds,"Person");
  da.Fill(dt);
  cn.Close();

  2、多次調用Fill方法需要注意數據重復和有效更新數據的問題

  假如我們多次調用了Fill方法Fill同一個DataTable

  da.Fill(ds,"Customers");
  …….
  da.Fill(ds,"Customers");

  通過兩次調用Fill方法,SqlDataAdapter執行兩次查詢,並兩次將查詢結果保存到DataSet中,第一次調用在DataSet中創建了一個名為Customers的新表。第二次調用Fill方法將查詢的結果追加到DataSet中的同一個表中,因此,每個客戶的信息將在DataSet中出現兩次!當然,如果數據庫管理員對Customers表定義了主鍵,則SqlDataAdapter在天成DataTable時,會判斷重復行,並自動丟棄掉舊的值。

  考慮一下,假定一個特定客戶在第一次調用Fill方法時,存儲於數據庫中,那么SqlDataAdapter會將其添加到新建的DataTable中。如果后來這個客戶被刪除了,那么第二次調用Fill方法時,SqlDataAdapter將不會在查詢結果中找到該客戶信息,但是它也不會將客戶信息從DataSet中刪除。這就導致了數據更新的問題。

   InsertCommand

       static void Main(string[] args)
        {
            //INSERT實例,好復雜
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";
            SqlConnection conn = new SqlConnection(str);

            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Age", typeof(int));
            SqlDataAdapter adapter = new SqlDataAdapter();
            //adapter.Fill(dt);

            dt.Rows.Add(new object[] { "5", "曹操", "29" });
            adapter.InsertCommand = new SqlCommand("INSERT INTO Person(Id,Name,Age) values(@ID,@Name,@Age)", conn);
            adapter.InsertCommand.Parameters.Add("Id", SqlDbType.Int);
            adapter.InsertCommand.Parameters.Add("Name", SqlDbType.VarChar);
            adapter.InsertCommand.Parameters.Add("Age", SqlDbType.Int);

            adapter.InsertCommand.Parameters["Id"].SourceColumn = "Id";
            adapter.InsertCommand.Parameters["Name"].SourceColumn = "Name";
            adapter.InsertCommand.Parameters["Age"].SourceColumn = "Age";

            adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
            //adapter.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                adapter.Update(dt);
            }

            Console.ReadKey();
        }

   UpdateCommand

        static void Main(string[] args)
        {
            //Update實例
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";

            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                DataSet ds = new DataSet();
                string sql = "select * from Person";
                SqlDataAdapter adapate = new SqlDataAdapter(sql, conn);
                adapate.Fill(ds, "Person");

                ds.Tables["Person"].Rows[0]["Name"] = "改改改";

                //動態生成的UpdateCommand必須要有主鍵
                SqlCommandBuilder builder = new SqlCommandBuilder(adapate);
                adapate.Update(ds, "Person");
            }
            Console.ReadKey();
        }

  DeleteCommand

        static void Main(string[] args)
        {
            //Delete實例
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";

            using (SqlConnection conn = new SqlConnection(str))
            {
                DataSet ds = new DataSet();
                string sql = "SELECT * FROM Person";
                SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
                adapter.Fill(ds, "Person");
                adapter.DeleteCommand = new SqlCommand("DELETE FROM Person WHERE Id=@Id", conn);
                adapter.DeleteCommand.Parameters.Add("Id", SqlDbType.Int);
                adapter.DeleteCommand.Parameters["Id"].SourceColumn = "Id";
                //刪除第一行
                ds.Tables["Person"].Rows[0].Delete();
                Console.WriteLine(ds.Tables["Person"].Rows.Count);
                adapter.Update(ds.Tables["Person"]);
            }

            Console.ReadKey();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM