熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET讀書筆記系列

2022-06-13   來源: .NET編程 

  ADONET概述

  一NET數據提供程序

  Net框架提供數據提供程序SQL Client NET Data Provider和Ole DB NET Data Provider前者專為SQL Server以及以後的版本的數據庫進行通信而設計後者允許通過OLE DB提供程序與各種數據存儲進行通信無論使用哪種方式所編寫的代碼都很相似

  二對象分類概述

    連接的對象

  ⅠConnection對象

  表示與數據源之間的連接可通過Connection對象的各種不同屬性指定數據源的類型位置以及其他屬性可用它來與數據庫建立連接或斷開連接Connection對象起到渠道的作用其他對象如DataAdapter和Command對象通過它與數據庫通信

  ⅡCommand對象

  表示對數據庫的查詢對存儲過程的調用或要返回特定表內容的直接請求可使用Command對象對數據庫執行任何一種查詢操作

  ⅢDataReader對象

  DataReder用於以最快的數據檢索並檢查查詢所返回的行可使用DataReader對象來檢查查詢結果一次查詢一行當移到下一行時前一行的內容就會被放棄DataReader不支持更新操作由DataReader返回的數據是只讀的由於DataReader對象支持最小特性集所以它的速度非常快而且是輕量的

  ⅣTransaction對象

  Connection對象有一個BeginTransaction方法可用來創建Transaction對象該對象可用來在    Transaction對象的生存期提交或取消對數據庫所做的更改

  ⅤParameter對象

  要使用參數化的Command對象可先為查詢中的每個參數創建Parameter對象並將它們添加到Command對象的Paramters集合中ADONET的Parameter對象公開一些屬性和方法可用來定義參數的數據類型和值

  ⅥDataAdapter對象

  DataAdapter對象充當數據庫和ADONET對象模型中斷開連接的對象之間的橋梁DataAdapter對象會填充DataSet對象中的表而且能讀取緩存的更改並將其提交給數據庫

    斷開連接的對象

  ⅠDataTable對象

  DataTable對象允許您通過行和列的集合查看數據通過DataAdapter對象的Fill方法可以將查詢的結果存儲在DataTable中一旦從數據庫中讀出了數據將其存儲在DataTable對象中數據與服務器之間的連接就斷開拉

  DataTable類包含了其他斷開連接對象的集合例如DataRowDataColumnConstraints等

  ⅡDataColumn對象

  每個DataTable都有一個Columns集合該集合是DataColumn對象的容器DataColumn對象存儲了有關列結構的信息

  ⅢConstraint對象

  Constraint對象存在於DataTable對象的Constraints集合中可以建立一個Constraint對象確保某一列或多個列中的值在DataTable中是惟一的

  ⅣDataRow對象

  想要訪問存儲在DataTable對象中的實際值可以使用對象的Rows集合該集合中包含了一組DataRow對象DataTable通過DataRows的集合使得所有數據行都可以訪問DataRow對象也是更新的起點

  ⅤDataSet對象

  可以將DataSet對象視為一些DataTable對象的容器DataSet對象還有一些屬性可以向文件內存地址寫入或讀出該對象可以只保存DataSet對象的內容或只保存DataSet對象的結構也可以兩者都保存

  ⅥDataRelation對象

  DataSet類定義了一個Realtion屬性該屬性是DataRelation對象的一個集合可以使用DataRelation對象來表明DataSet中不同的DataTable對象之間的關系

  DataRelation對象還引入了一些屬性來強化引用的完整性

  ⅦDataView對象

  一旦獲取了DataTable對象中查詢的結果就可以使用DataView對象以不同方式來查看數據可以使用多個DataView對象在同時查看同一DataTable

    強類型DataSet對象

  強類型的DataSet可以幫助簡化建立數據訪問應用程序的過程強類型DataSet是Visual Studio中的一個類Visual Studio建立它的時候通過其屬性使所有的表和列信息都有效強類型DataSet對象還為入創建新行等屬性提供了一些自定義方法

  Connection對象

  一特點介紹

  在ADONET對象模型中Connection對象代表了與數據庫之間的連接可以使用Connection對象的屬性來指定用戶憑據以及數據源的位置

  二使用介紹

  基本使用

  string strConn=data source =initial catalog =Northwindpersist security info=false user id=sapassword=

  SqlConnection cn = new SqlConnection(strConn)

  cnOpen()

  ……………

  cnClose()

  連接池

  默認情況下使用連接池

  當不想使用時在Ole DB連接字符串中加入OLE DB Service=

  在Sql連接字符串中加入Pooling=false

  與其他對象關系

  Ⅰ創建Commands

  string strConn=………

  SqlConnection cn=new SqlConnection(strConn)

  cnOpen()

  SqlCommand cmd = cnCreateCommand()

  Ⅱ啟動事務

  string strConn=………

  SqlConnection cn=new SqlConnection(strConn)

  cnOpen()

  SqlTransaction txn = cnBeginTransaction()

  三屬性方法事件介紹

  屬性

  ⒈ConnectionString 連接字符串其中包含源數據庫名稱和建立初始連接所需的其他參數默認值為空字符串只能在Connection未與數據源連接時設置其屬性當連接到數據源時屬性是只讀的

  ⒉ConnectionTimeOut 等待連接打開的時間(以秒為單位)默認值為

  ⒊Database當前數據庫的名稱或連接打開後要使用的數據庫的名稱默認值為空字符串

  ⒋DataSource要連接的 SQL Server 實例的名稱默認值為空字符串

  ⒌StateConnectionState值的按位組合默認值為Closed

  成員名稱說明值

  Broken與數據源的連接中斷只有在連接打開之後才可能發生這種情況可以關閉處於這種狀態的連接然後重新打開

  

  Closed連接處於關閉狀態

  

  Connecting連接對象正在與數據源連接

  

  Executing連接對象正在執行命令

  

  Fetching連接對象正在檢索數據

  

  Open連接處於打開狀態

  

  ⒍ServerVersionSQL Server 實例的版本版本的格式為 ########其中前兩位是主版本中間兩位是次版本最後四位是發布版本該字符串的格式為 majorminorbuild其中 major 和 minor 必須為兩位數build 必須為四位數

  ⒎PacketSize 網絡數據包的大小(以字節為單位)默認值為 如果應用程序執行批量復制操作或者發送或接收大量的文本或圖像數據則使用比默認大小大的數據包可提高效率因為它可減少網絡的讀取和寫入操作如果應用程序發送或接收少量信息則可以將數據包大小設置為 字節該設置足以應付大多數數據傳送操作對於大多數應用程序而言最好使用默認的數據包大小

  PacketSize 可以是 字節范圍內的一個值如果該值超出了這個范圍就會產生異常

  方法

  ⒈BeginTransaction開始數據事務

  ⒉ChangeDatabase在一個打開的連接上更改當前數據庫

  ⒊Close關閉連接

  ⒋CreateCommand為當前連接創建一個SqlCommand

  ⒌Open打開連接

  事件

  ⒈InfoMessage當 SQL Server 返回一個警告或信息性消息時發生

  當 Sql Server 返回嚴重度等於或小於 的消息時會激發 InfoMessage 事件嚴重度在 之間的消息會引發錯誤而嚴重度超過 的消息將導致連接關閉

  ⒉StateChange當連接狀態更改時發生只要Connection對象的State屬性值發生變化該對象的StateChange事件就會被觸發

  SqlDataAdapter對象

  一特點介紹

  表示用於填充 DataSet 和更新 SQL Server 數據庫的一組數據命令和一個數據庫連接

  在SqlDataAdapter和DataSet之間沒有直接連接當完成SqlDataAdpaterFill(DataSet)調用後兩個對象之間就沒有連接了

  二使用介紹

  創建SqlDataAdapter

  ……

  string strSQL=Select * from Customers

  SqlCommand cmd=new SqlCommand(strSQLcn)

  SqlDataAdapter da=new SqlDataAdapter()

  daSelectCommand=cmd

  SqlDataAdapter構造函數

  ①string strConn=Provider=……

  string strSQL=select * from Customers

  SqlDataAdapter da=new SqlDataAdapter(strSQLstrConn)

  ②string strConn=Provider=……

  SqlConnection cn=new SqlConnection(strConn)

  SqlDataAdapter da=new SqlDataAdapter(select * from Customerscn)

  ③string strConn=Provider=……

  string strSQL=select * from Customers

  SqlConnection cn=new SqlConnection(strConn)

  SqlCommand cmd=new SqlCommand(strSQLcn)

  SqlDataAdapter da=new SqlDataAdapter(cmd)

  從查詢中獲取結果

  ①使用Fill方法

  ……

  SqlDataAdapter da=new SqlDataAdapter(strSQLstrConn)

  DataSet ds=new DataSet()

  daFill(ds)   //這裡ds中的表名為Table

  ②使用Fill方法創建DataTable對象和DataColumn對象

  ……

  SqlDataAdapter da=new SqlDataAdapter(strSQLstrConn)

  daTableMappingAdd(TableCustomers

  DataSet ds=new DataSet()

  daFill(ds)

  ③使用重載Fill方法

  SqlDataAdapterFill(DataSetCustomers

  SqlDataAdapterFill(DataTable)

  SqlDataAdapterFill(DataSetintStartRecordintNumRecordsTableName

  ④開放和關閉連接

  如果調用了一個SqlDataAdapter對象的Fill方法而SelectCommand屬性的Connection關閉了那麼SqlDataAdapter就會開放一個連接然後提交查詢獲取結果最後關閉連接如果在調用前開放了Connection那麼操作之後仍然保持開放

  ……

  SqlDataAdapter daCustomersdaOrders

  daCustomers=new SqlDataAdapter(Select * from Customerscn)

  daOrders=new SqlDataAdapter(Select * from Orderscn)

  DataSet ds=new DataSet()

  cnOpen()

  daCustomersFill(ds)

  daOrdersFill(ds)

  cnClose()

  ⑤多次調用Fill方法

  刷新DataSet中的數據最簡單的解決方法就是清空DataSet(或DataTable)然後再次調用DataAdapter對象的Fill方法

  三屬性方法事件介紹

  屬性

  ①AcceptChangeDuringFill確定由DataAdapter所獲取的行的RowState(默認為True)

  ②DeleteCommand獲取或設置一個 TransactSQL 語句或存儲過程以從數據集刪除記錄

  ③InsertCommand獲取或設置一個 TransactSQL 語句或存儲過程以在數據源中插入新記錄

  ④SelectCommand獲取或設置一個 TransactSQL 語句或存儲過程用於在數據源中選擇記錄

  ⑤UpdateCommand獲取或設置一個 TransactSQL 語句或存儲過程用於更新數據源中的記錄

  ⑥TableMappingsSqlDataAdapter用來將查詢的結果映射到DataSet的信息集合

  ⑦ContinueUpdate控制SqlDataAdapter在遇到一個錯誤之後是否繼續提交更改(默認為false)

  方法

  ①Fill執行存儲於SelectCommand中的查詢並將結果存儲在DataTable中

  ②FillSchema為存儲在SelectCommand中存儲的查詢獲取架構信息獲取查詢中的各列名稱和數據類型

  ③GetFillParameters為SelectCommand獲取一個包含著參數的數組

  ④Update向數據庫提交存儲在DataSet(或DataTableDataRows)中的更改該方法會返回一個整數值其中包含著在數據存儲中成功更新的行數

  事件

  ①FillError當DataAdapter遇到填充DataSet或DataTable的一個錯誤時該事件被觸發

  ②RowUpdated向數據庫提交一個修改的行之後被觸發

  ③RowUpdating向數據庫提交一個修改的行之前被觸發

  DataSet對象

  一特點介紹

  處理脫機數據在多層應用程序中很有用

  可以在任何時候查看DataSet中任意行的內容允許修改查詢結果的方法

  處理分級數據

  緩存更改

  XML的完整性DataSet對象和XML文檔幾乎是可互換的

  二使用介紹

  創建DataSet對象DataSet ds = new DataSet(DataSetName

  查看調用SqlDataAdapterFill創建的結構

  daFill(dsOrders

  DataTable tbl = dsTable[]

  foreach(DataColumn col in tblColumns)

  ConsoleWriteLine(colColumnName)

  查看SqlDataAdapter返回的數據

  ①DataRow對象

  DataTable tbl = dsTable[]

  DataRow row = tblRow[]

  ConsoleWriteLine(ros[OrderID])

  ②檢查存儲在DataRow中的數據

  DataTable tbl = rowTable

  foreach(DataColumn col in tblColumns)

  ConsoleWriteLine(row[col])

  ③檢查DatTable中的DataRow對象

  foreach(DataRow row in tblRows)

  DisplayRow(row)

  校驗DataSet中的數據

  ①校驗DataColumn的屬性ReadOnlyAllowDBNullMaxLengthUnique

  ②DataTable對象的Constrains集合UiqueConstraintsPrimarykeyForeignkeyConstraints

  通常不必刻意去創建ForeignkeyConstraints因為當在DataSet的兩個DataTable對象之間創建關系時會創建一個

  ③用SqlDataAdapterFill模式來檢索模式信息

  編寫代碼創建DataTable對象

  ①創建DataTable對象DataTable tbl = new DataTable(TableName

  ②將DataTable添加到DataSet對象的Table集合

  DataSet ds = new DataSet()

  DataTable tbl = new DataTable(Customers

  dsTablesAdd(tbl)

  DataSet ds = new DataSet()

  DataTable tbl = dsTablesAdd(Customers

  DataTable對象只能存在於至多一個DataSet對象中如果希望將DataTable添加到多個DataSet中就必須使用Copy方法或Clone方法Copy方法創建一個與原DataTable結構相同並且包含相同行的新DataTableClone方法創建一個與原DataTable結構相同但沒有包含任何行的新DataTable

  ③為DataTable添加列

  DataTable tbl = dsTablesAdd(Orders

  DataColumn col =tblColumnsAdd(OrderIDtypeof(int))

  colAllowDBNull = false

  colMaxLength =

  colUnique = true

  tblPrimaryKey = new DataColumn[]{tblColumns[CustomersID]}

  當設置主鍵時AllowDBNull自動設置為False

  ④處理自動增量列

  DataSet ds = new DataSet()

  DataTable tbl = dsTablesAdd(Orders

  DataColumn col = tblColumnsAdd(OrderIDtypeof(int))

  colAutoIncrement = true

  colAutoIncrementSeed =

  colAutoIncrementStep =

  colReadOnly = true

  ⑤添加基於表達式的列

  tblColumnsAdd(ItemTotaltypeof(Decimal)Quantity*UnitPrice

  修改DataTable內容

  ①添加新DataRow

  DataRow row = dsTables[Customers]NewRow()

  row[CustomerID] = ALFKI

  dsTables[Customers]RowsAdd(row)

  object[] aValues ={ALFKIAlfredsAnders}

  daTables[Customers]LoadDataRow(aValuesfalse)

  ②修改當前行

  修改行的內容逼供內不會自動修改數據庫中相應的內容對行所做的修改被視為是隨後將使用SqlDataAdapter對象來提交交給數據庫的待定的更改

  DataRow rowCustomer

  rowCustomer = dsTables[Custoemrs]RowsFind(ANTON

  if(rowCustomer == null)

  //沒有查找客戶

  else

  {

  rowCustomer[CompanyName] =NewCompanyName

  rowCustomer[ContactName] =NewContactName

  }

  //推薦使用這種方式

  DataRow rowCustomer

  rowCustomer = dsTables[Custoemrs]RowsFind(ANTON

  if(rowCustomer == null)

  //沒有查找客戶

  else

  {

  rowCustomerBeginEdit()

  rowCustomer[CompanyName] =NewCompanyName

  rowCustomer[ContactName] =NewContactName

  rowCustomerEndEdit()

  }

  //null表示不修改該列的數據

  obejct[] aCustomer ={nullNewCompanyNameNewContactNamenull}

  DataRow rowCustomer

  rowCustomer = dsTables[Customers]RowsFind(ALFKI

  rowCustomerItemArray = aCustomer

  ③處理DataRow的空值

  //查看是否為空

  DataRow rowCustomer

  rowCustomer = dsTables[Customers]RowsFind(ALFKI

  if(rowCustomerIsNull(Phone))

  ConsoleWriteLine(Its Null

  else

  ConsoleWriteLine(Its not Null

  //賦予空值

  rowCustomer[Phone] = DBNullValue

  ④刪除DataRow

  DataRow rowCustomer

  rowCustomer = dsTables[Customers]RowsFind(ALFKI

  rowCustomerDelete()

  ⑤清除DataRow

  DataRow rowCustomer = dsTables[Customers]RowsFind(ALFKI

  rowCustomerItemArray = aCustomer

  daTables[Customers]Remove(rowCustomer)

  或者

  dsTables[Customers]RemoveAt(intIndex)

  ⑥使用DataRowRowState屬性 UnchangedDetachedAddedModifiedDeleted

  private void DemonstrateRowState()

  { // Run a function to create a DataTable with one column DataTable myTable = MakeTable()DataRow myRow

  // Create a new DataRow myRow = myTableNewRow()// Detached row ConsoleWriteLine(New Row + myRowRowState)

  myTableRowsAdd(myRow)// New row ConsoleWriteLine(AddRow + myRowRowState)

  myTableAcceptChanges()// Unchanged row ConsoleWriteLine(AcceptChanges + myRowRowState)

  myRow[FirstName] = Scott// Modified row ConsoleWriteLine(Modified + myRowRowState)

  myRowDelete()// Deleted row ConsoleWriteLine(Deleted + myRowRowState)}

  ⑦檢查DataRow中的掛起更改

  DataRow rowCustomer

  rowCustomer = dsTables[Customers]RowsFind(ALFKI

  rowCustomer[CompanyName] = NewCompanyName

  string strNewCompanyNamestrOldCompanyName

  ConsoleWriteLine(rowCustomer[CompanyNameDataRowVersionCurrent])

  ConsoleWriteLine(rowCustomer[CompanyNameDataRowVersionOriginal])

  三屬性方法事件介紹

  DataSet

  ①屬性

  CaseSensitive用於控制DataTable中的字符串比較是否區分大小寫

  DataSetName當前DataSet的名稱如果不指定則該屬性值設置為NewDataSet如果將DataSet內容寫入XML文件DataSetName是XML文件的根節點名稱

  DesignMode如果在設計時使用組件中的DataSetDesignMode返回True否則返回False

  HasErrors表示DataSet中的DataRow對象是否包含錯誤如果將一批更改提交給數據庫並將DataAdapter對象的ContinueUpdateOnError屬性設置為True則在提交更改後必須檢查DataSet的HasErrors屬性以確定是否有更新失敗

  NameSpace和Prefix指定XML命名空間和前綴

  Relations返回一個DataRelationCollection對象

  Tables檢查現有的DataTable對象通過索引訪問DataTable有更好的性能

  ②方法

  AcceptChanges和RejectChanges接受或放棄DataSet中所有掛起更改調用AcceptChanges時RowState屬性值為Added或Modified的所有行的RowState屬性都將被設置為UnChanged任何標記為Deleted的DataRow對象將從DataSet中刪除調用RejectChanges時任何標記為Added的DataRow對象將會被從DataSet中刪除其他修改過的DatRow對象將返回前一狀態

  Clear清除DataSet中所有DataRow對象該方法比釋放一個DataSet然後再創建一個相同結構的新DataSet要快

  Clone和Copy使用Copy方法會創建與原DataSet具有相同結構和相同行的新DataSet使用Clone方法會創建具有相同結構的新DataSet但不包含任何行

  GetChanges返回與原DataSet對象具有相同結構的新DataSet並且還包含原DataSet中所有掛起更改的行

  GetXml和GetXmlSchema使用GetXml方法得到由DataSet的內容與她的架構信息轉換為XML格式後的字符串如果只希望返回架構信息可以使用GetXmlSchema

  HasChange表示DataSet中是否包含掛起更改的DataRow對象

  Merge從另一個DataSetDataTable或現有DataSet中的一組DataRow對象載入數據

  ReadXml和WriteXml使用ReadXml方法從文件TextReader數據流或者XmlReader中將XML數據載入DataSet中

  Reset將DataSet返回為未初始化狀態如果想放棄現有DataSet並且開始處理新的DataSet使用Reset方法比創建一個DataSet的新實例好

  ③事件

  MergeFailed在DataSet的Merge方法發生一個異常時觸發

  DataTable

  ①屬性

  ②方法

  ③事件

  ColumnChanged在列的內容被改變之後觸發

  ColumnChangding在列的內容被改變之前觸發

  RowChangedRowChangingRowDeletedRowDeleting

  DataColumn

  ①屬性

  DataRow

  ①屬性

  HasError確定行是否包含錯誤

  Item通過指定行的列數列的名稱或DataColumn對象本身訪問列的內容

  ItemArray獲取或設置行中所有列的值

  RowError返回一個包含行錯誤信息的字符串

  RowState返回DataRowState枚舉中的值來表示行的當前狀態

  Table返回DataRow對象所在的DataTable

  ②方法

  AcceptChanges和RejectChanges提交和放棄掛起更改

  BeginEditCancelEditEndEdit

  ClearErrors清除DataRow中所有的錯誤

  DeleteDelete方法實際上並不從DataRow表的Row集合中刪除該DataRow當調用DataRow對象的Delete方法時ADONET將該行標記為刪除之後調用SqlDataAdapter對象的Update方法來刪除其在數據庫中對應的行

  如果希望徹底刪除DataRow可以調用Delete方法接著再調用它的AccepteChanges方法還可以使用DataRowCollection對象的Remove方法完成相同的任務


From:http://tw.wingwit.com/Article/program/net/201311/12531.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.