C# SqlCommand和SqlDataAdapter的區別


SqlCommand和SqlDataAdapter的區別 
SqlCommand對應DateReader   SqlDataAdapter對應DataSet   SqlCommand的執行效率比較高,但不靈活,功能也有限   SqlDataAdapter的效率要低點,它是連接的,可隨時更新數據,功能強大。   很多編程用其中一種就可以了。   SqlCommand是C#中與Sql數據庫打交道的對象,幾乎所有的Sql數據庫操作都需要使用該對象來實現,但其功能有限,只是簡單的實現了與Sql數據庫的接口而已;   SqlDataAdapter是一個功能強大的SqL數據適配器,也用於操作Sql數據庫,但它的操作都要通過SqlCommand來實現(有一個屬性對象的類型就是SqlCommand),也就是說,可以把SqlDataAdapter看作是一個把一些特殊功能封裝了、增強了的SqlCommand!   adapter是和dataset打交道的,command不能直接與dataset打交道,要通過adapter. adapter的定義是基於command的,當然也可以之間在定義adapter的時候寫入sql語句和connection對象 如<BR>dim ada as new sqlclient.sqladapter(select * from stu,conn1)<BR><BR>也可以這么寫 dim com1 as new sqlclient.sqlcommand(select * from stu,conn1)<BR>             dim ada as new sqlclient.sqladapter(com1)<BR>想要把數據顯示出來就不得不用到adapter來給dataset傳值,而command不能直接傳值給dataset 可以這樣理解: DataSet用來裝表的集合,里面可以裝從SqlDataAdapter中返回的一系列的DataTable 如果返回的有多張表,那么我們可以通過索引的方式來找到想要的表:DataTable dt = ds.Tables[0];或DataTable dt = ds.Tables["products"]; DataSet可以直接做為數據控件的數據源,也可以從中獲取表或表的視圖來做為數據源.如: this.DataList1.DataSource = dt; this.DataList2.DataSource = dt.Tables[0]; this.Datalist3.DataSource = dt.Tables[0].DefaultView; 這三句的效果都是一樣的. SqlDataAdapter是針對於SQL數據庫的一個數據適配器,對應的還有OledbDataAdapter等等,它起着牽線搭橋的作用,我們可以用它來創建或是執行一個數據庫操作命令,並將返回的結果集填充到DataSet中去.

 

SqlDataAdapter對象

一、特點介紹
1、表示用於填充 DataSet 和更新 SQL Server 數據庫的一組數據命令和一個數據庫連接。
2、在SqlDataAdapter和DataSet之間沒有直接連接。當完成SqlDataAdpater.Fill(DataSet)調用后,兩個對象之間就沒有連接了。
二、使用介紹
1、創建SqlDataAdapter
    string strSQL=“Select * from Customers”;
    SqlCommand cmd=new SqlCommand(strSQL,cn);
    SqlDataAdapter da=new SqlDataAdapter();
    da.SelectCommand=cmd;
2、SqlDataAdapter構造函數
①string strConn=“Provider=.....”;
  string strSQL=“select * from Customers”;
  SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
②string strConn=“Provider=.....”;
  SqlConnection cn=new SqlConnection(strConn);
  SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);
③string strConn=“Provider=.....”;
  string strSQL=“select * from Customers”;
  SqlConnection cn=new SqlConnection(strConn);
  SqlCommand cmd=new SqlCommand(strSQL,cn);
  SqlDataAdapter da=new SqlDataAdapter(cmd);
3、從查詢中獲取結果
①使用Fill方法
    SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
    DataSet ds=new DataSet();
    da.Fill(ds);   //這里ds中的表名為Table
②使用Fill方法創建DataTable對象和DataColumn對象
    SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
    da.TableMapping.Add(“Table”,“Customers”);    
    DataSet ds=new DataSet();
    da.Fill(ds);
③使用重載Fill方法
    SqlDataAdapter.Fill(DataSet,“Customers”);
    SqlDataAdapter.Fill(DataTable);
    SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);
④開放和關閉連接
    如果調用了一個SqlDataAdapter對象的Fill方法,而SelectCommand屬性的Connection關閉了,那么SqlDataAdapter就會開放一個連接,然后提交查詢、獲取結果、最后關閉連接。如果在調用前開放了Connection,那么操作之后仍然保持開放。
    SqlDataAdapter daCustomers,daOrders;
    daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);
    daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
    DataSet ds=new DataSet();
    cn.Open();
    daCustomers.Fill(ds);
    daOrders.Fill(ds);
    cn.Close();
⑤多次調用Fill方法
    刷新DataSet中的數據,最簡單的解決方法就是清空DataSet(或DataTable),然后再次調用DataAdapter對象的Fill方法。    
三、屬性方法事件介紹 
1、屬性
①AcceptChangeDuringFill:確定由DataAdapter所獲取的行的RowState(默認為True)。
②DeleteCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,以從數據集刪除記錄。
③InsertCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,以在數據源中插入新記錄。
④SelectCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,用於在數據源中選擇記錄。
⑤UpdateCommand:獲取或設置一個 Transact-SQL 語句或存儲過程,用於更新數據源中的記錄。
⑥TableMappings:SqlDataAdapter用來將查詢的結果映射到DataSet的信息集合。
⑦ContinueUpdate:控制SqlDataAdapter在遇到一個錯誤之后是否繼續提交更改(默認為false)。
2、方法
①Fill:執行存儲於SelectCommand中的查詢,並將結果存儲在DataTable中。
②FillSchema:為存儲在SelectCommand中存儲的查詢獲取架構信息。獲取查詢中的各列名稱和數據類型。
③GetFillParameters:為SelectCommand獲取一個包含着參數的數組。
④Update:向數據庫提交存儲在DataSet(或DataTable、DataRows)中的更改。該方法會返回一個整數值,其中包含着在數據存儲中成功更新的行數。
3、事件
①FillError:當DataAdapter遇到填充DataSet或DataTable的一個錯誤時,該事件被觸發。
②RowUpdated:向數據庫提交一個修改的行之后被觸發。
③RowUpdating:向數據庫提交一個修改的行之前被觸發。

SqlCommand對象

介紹
SqlCommand對象允許你指定在數據庫上執行的操作的類型。比如,你能夠對數據庫中的行數據執行select,insert,modify以及delete命令。SqlCommand對象能被用來支持斷開連接數據管理的情況,但是在這節課我們將只單獨使用SqlCommand對象。后面關於SqlDataAdapter的課程將解釋如何使用斷開數據實現應用程序。這節課將同時展示如何從數據庫中返回一個單獨的值,比如表中記錄的數量。
創建SqlCommand對象
SqlCommand cmd = new SqlCommand("select CategoryName from Categories", conn);
上面一行是典型的實例化SqlCommand對象的代碼。它使用一個string參數來保存你想要執行的命令以及一個關於SqlConnection對象的引用。SqlCommand具有重載形式,這些形式你將在以后的示例中看到。
查詢數據
當使用SQL的select命令,會得到一組數據集。為了和SqlCommand對象配合使用,你應該使用ExecuteReader方法,它返回一個SqlDataReader對象。我們將在后面的內容討論SqlDataReader。下面的例子顯示了如何使用SqlCommand對象來得到SqlDataReader對象:
// 1. Instantiate a new command with a query and connection
SqlCommand cmd = new SqlCommand("select CategoryName from Categories", conn);
// 2. Call Execute reader to get query results
SqlDataReader rdr = cmd.ExecuteReader();
在上面的示例中,我們通過傳遞命令字符串核連接對象到構造函數的方式實體化了SqlCommand對象。然后我們通過SqlCommand對象cmd調用ExecuteReader方法得到了SqlDataReader對象。
這些代碼是表1中ReadData方法的一部分,我們將在后面集中介紹。
插入數據
要對數據庫插入數據,使用SqlCommand對象的ExecuteNonQuery方法。下面的代碼顯示了如何向數據庫表插入數據: 
string insertString = @"insert into Categories(CategoryName, Description)values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";
SqlCommand cmd = new SqlCommand(insertString, conn);
cmd.ExecuteNonQuery();
SqlCommand的實例化過程與以前看到的有一些區別,但是基本一致。在構造函數的第一個字符串參數中是用的是插入字符串變量而不三字符串字面值。該變量在SqlCommand聲明之前被聲明了。
注意在insertString文本中“doesn’’t”的兩個單引號(’’)。這是將它轉義為適當的單引號。
另外一個需要注意的是我們顯式指明了列:CategoryName和Description。列表中有一個主鍵名為CategoryID。我們忽略這列因為SQL Server將自動添加此字段。試圖對主鍵比如CategoryID添加值會產生異常。
為了執行此命令,我們簡單的對SqlCommand實體cmd調用ExecuteNonQuery方法。
這段代碼是表1中InsertData方法的一部分,我們將在后面集中介紹。
更新數據
ExecuteNonQuery方法同樣用來更新數據。下面的代碼顯示了如何更新數據:
string updateString = @"update Categories set CategoryName = 'Other'
  where CategoryName = 'Miscellaneous'";
SqlCommand cmd = new SqlCommand(updateString);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
刪除數據
你同樣能夠使用ExecuteNonQuery方法刪除數據。下面的例子說明了如何使用EXecuteNonQuery方法刪除數據庫中的記錄。 
string deleteString = @"delete from Categories where CategoryName = 'Other'";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = deleteString;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
這個示例使用了沒有參數的SqlCommand構造函數。取而代之的是顯式地設置了CommandText和SqlCommand對象的連接屬性。
我們同樣能夠使用SqlCommand構造函數在前面的兩個重載形式——用來插入或者更新命令——得到相同的結果。它說明了在任何時候既能夠改變命令文本又能夠改變連接對象。
ExecuteNonQuery方法調用將命令傳遞給數據庫。
得到單一值
某些時候你想從數據庫中只取一個值,它可能是關於數據集的計數、和、平均值或者其他聚合數值。使用ExecuteReader方法並計算代碼中的結果並不是做這些事情的有效方式。最好的選擇就是讓數據庫能夠執行並且只返回你所需要的單獨的值。下面的示例說明了如何使用ExecuteScalar方法來實現:
SqlCommand cmd = new SqlCommand("select count(*) from Categories", conn);
  int count = (int)cmd.ExecuteScalar(); 
總結
SqlCommand對象允許你擦許並對數據庫傳送命令。它含有針對不同的命令而特定的方法。ExecuteReader方法返回SqlDataReader對象來現實查詢的結果。對於insert,update以及delete這些SQL命令,使用ExecuteNonQuery方法。如果你只需要查詢的單獨聚集值,ExecuteScalar方法是最好的選擇

SqlDataAdapter和SqlCommand對比分析

一、SqlDataAdapter和DateSet

原理:DateSet是數據的內存駐留表示形式,它提供了獨立於數據源的一致關系編程模型;從某種程度上說DateSet就是一個不可視的數據庫。但真正與數據源打交道的是 SqlDataAdapter,包括從數據源填充數據集和從數據集更新數據源。SqlDataAdapter使用Fill()方法將檢索的數據填充到 DateSet。

流程:IE——GridView——DataSet——SqlDataAdapter——SQL數據庫

public void BindGrid()

{

SqlDataAdapter myAdp = new SqlDataAdapter("select * from UserAdmin order by UserId desc", conn);

DataSet ds = new DataSet();

myAdp.Fill(ds, "Authors");

//Label1.Text = ds.Tables[0].Rows.Count.ToString(); //得到共有多少條記錄;

GridView1.DataSource = ds.Tables["Authors"].DefaultView;

GridView1.DataBind();

}

二、SqlCommand和SqlDataReade

原理:SqlCommand通過ExecuteReader()方法將得到的數據給SqlDataReade對象。

SqlDataReade逐行將從數據源獲得的數據放進緩沖區進行處理。

優點:SqlDataReade執行速度快,提高應用程序性能。

優點原因:一旦數據可用,SqlDataReade就會立即檢索該數據,而不是等待返回查詢的全部結果;默認情況下,一次只在緩沖區存儲一行,從而降低系統開銷。

缺點:使用不靈活。

流程:IE——SqlDataReade——SqlCommand——SQL數據庫

注:每次使用完SqlDataReade對象后一定要調用Close()方法將其關閉。因為SqlDataReade對象以獨占的方式使用Connection。

例:

SqlCommand myconn = new SqlCommand("select * from v_economy2_comidd where eid=" + Request.QueryString["eid"] + "", conn);

conn.Open();

SqlDataReader rd = myconn.ExecuteReader();

rd.Read();

Lbyear1.Text = rd["year1"].ToString();

Lbmonth1.Text = rd["month1"].ToString();

Lbcom_name.Text = rd["com_name"].ToString();

rd.Close();

conn.Close();

區別在於:
SqlDataAdapter:
用於填充 DataSet 和更新 SQL 數據庫的“一組”數據命令和“一個”數據庫連接。
SqlDataAdapter不但可以操作多個SQL命令,而且還可以操作一個SQL命令

DataSet是關系型數據庫的抽象,ADO.NET使用DataAdapter(意為數據適配器)作為dataset和數據源之間的橋梁;DataAdapter 提供了Fill()方法從數據庫中獲取數據並生成DataSet。
SqlCommand:
對 SQL 數據庫執行的“一個”SQL 語句或存儲過程。
SqlCommand只能操作一個SQL命令

個人覺得SqlCommand用來更新少量數據時比較合適,速度快,使用方便。他是執行sql語句查詢的。
SqlDataAdapter用於把數據放到DataSet中,集中修改、刪除后,通過Update把整個DataSet再提交回給數據庫進行處理


免責聲明!

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



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