明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP.NET講座(5)-數(shù)據(jù)庫的設(shè)置ADO.NET

[摘要]自若干年前推出開放式數(shù)據(jù)庫連接 (ODBC) 應(yīng)用程序編程接口 (API) 以來,出現(xiàn)了各種各樣的數(shù)據(jù)庫訪問技術(shù),而 ADO.NET 是其中最新的一種。在這過程中,發(fā)生了許多有趣的事。例如,COM 闖入數(shù)據(jù)庫領(lǐng)域,開始培植 OLE DB 的殖民進(jìn)程。然后,大致相當(dāng)于 OLE DB 自動(dòng)化版本的 A...

  自若干年前推出開放式數(shù)據(jù)庫連接 (ODBC) 應(yīng)用程序編程接口 (API) 以來,出現(xiàn)了各種各樣的數(shù)據(jù)庫訪問技術(shù),而 ADO.NET 是其中最新的一種。在這過程中,發(fā)生了許多有趣的事。例如,COM 闖入數(shù)據(jù)庫領(lǐng)域,開始培植 OLE DB 的殖民進(jìn)程。然后,大致相當(dāng)于 OLE DB 自動(dòng)化版本的 ActiveX? Data Objects (ADO) 被選來統(tǒng)治 Windows? 數(shù)據(jù)庫開發(fā)者的 Visual Basic? 和 ASP 社區(qū)。

  通過 .NET,Microsoft 正在提供通用框架(即 Framework Class Library),其中將包括所有現(xiàn)有的 Windows API 甚至更多的內(nèi)容。特別值得一提的是,它包括大量常用的庫,而這些庫現(xiàn)在需要通過各個(gè) COM 對(duì)象分別獲得。在這些庫中,您會(huì)發(fā)現(xiàn) XML 和 ADO 對(duì)象模型,它們被集成到了叫做 ADO.NET 的類子樹中。

  ADO.NET 事實(shí)上成為構(gòu)建數(shù)據(jù)感知 .NET 應(yīng)用程序的基礎(chǔ)。和 ADO 不同的是,ADO.NET 遵循更通用的原則,不那么專門面向數(shù)據(jù)庫。ADO.NET 集合了所有允許數(shù)據(jù)處理的類。這些類表示具有典型數(shù)據(jù)庫功能(如索引、排序和視圖)的數(shù)據(jù)容器對(duì)象。盡管 ADO.NET 是 .NET 數(shù)據(jù)庫應(yīng)用程序的權(quán)威解決方案,但從總體設(shè)計(jì)上來看,它不象 ADO 模型那樣以數(shù)據(jù)庫為中心,這是 ADO.NET 的一大特點(diǎn)。

  ADO.NET 與 ADO 有很大差異。ADO.NET 是新的數(shù)據(jù)訪問編程模型,需要開發(fā)人員的全面理解、投入和新思維。然而,一旦開始掌握 ADO.NET,您將意識(shí)到:原有的 ADO 技巧非常有助于您以不同、卻更巧妙和可靠的方式來創(chuàng)建有效的應(yīng)用程序和解決各種老問題。
(以上譯自 Microsoft .NET部一位官員的講話)

  5.1 目前的ADO.net

  目前 ADO.NET 提供了兩種托管提供程序:一種用于 SQL Server 7.0 或更高版本,另一種用于其他所有您可能已經(jīng)安裝的 OLE DB 提供程序。在這兩種情況下您分別使用不同的類,但遵循相似的命名規(guī)則。除前綴外,名稱都是相同的。前一種情況前綴為 SQL,后一種情況則是 ADO。

<% @ Import Namespace="System.Data.ADO" %>
<% @ Import Namespace="System.Data.SQL" %>

  您應(yīng)該使用 SQL 類訪問 SQL Server 表,因?yàn)樗鼈冎苯舆M(jìn)入數(shù)據(jù)庫服務(wù)器的內(nèi)部 API,跳過了由 OLE DB 提供程序表示的中間層。ADO 類是 OLE DB 提供程序上的 .NET 接口,它們使用 COM Interop 橋進(jìn)行工作。

  5.2 連接一個(gè)數(shù)據(jù)庫

Dim myConnection As New
 SQLConnection("server=localhost;uid=sa;pwd=;database=pubs")
Dim myCommand As New
 SQLDataSetCommand("select * from Authors", myConnection)

或者
 SQLConnection myConnection = new SQLConnection();
 myConnection.DataSource = "localhost";
 myConnection.UserID = "sa";
 myConnection.Password = "";
 myConnection.ConnectionTimeout = 30;
 myConnection.Open();
 myConnection.Database = "pub";
 myConnection.IsolationLevel = IsolationLevel.ReadCommitted
  

  這里我們需要講述一下Connection的方法和屬性了。

  ConnectionTimeout超時(shí)

  DataBase 缺省數(shù)據(jù)庫

  DataSource DNS

  UserID 原來叫UID

  Password

  State 取得目前連接的狀態(tài)

  Open() 打開

  Close() 關(guān)閉
  5.3 操作數(shù)據(jù)庫

  通過一個(gè)Command對(duì)象,我們才可以對(duì)數(shù)據(jù)庫進(jìn)行操作

Dim myConnection As SQLConnection = New SQLConnection("server=localhost;uid=sa;
pwd=;database=pubs")
Dim myCommand As SQLCommand = New SQLCommand("select * from Authors", myConnection)
myConnection.Open()
Dim dr As New SQLDataReader
myCommand.Execute(dr)

...

myConnection.Close()

或者 這樣做
Dim myConnection As New SQLConnection("server=localhost;uid=sa;pwd=;database=pubs")
Dim mycommand As New SQLCommand( _
"UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", _
myConnection)
myCommand.ActiveConnection.Open()
myCommand.ExecuteNonQuery()
myCommand.ActiveConnection.Close()


  這些都是SQLCommand的標(biāo)準(zhǔn)用法,下面列出了Command的所有屬性和相關(guān)方法。

  ActiveConnection 取得或設(shè)置聯(lián)結(jié)Connections

  CommandText 執(zhí)行的SQL語句或儲(chǔ)存過程(StoredProcedure)名

  CommandTimeout 超時(shí)

  CommandType Command操作的類型(StoredProcedure,Text,TableDirect)三種,默認(rèn)Text

  Parameters 操作儲(chǔ)存過程時(shí)使用

  Execute() 執(zhí)行SQL語句或儲(chǔ)存過程

  ExecuteNonQuery() 同上,但無返回,或者說,只返回記錄的數(shù)量

  注意: 和ASP一樣,在運(yùn)行完以后一定要注意關(guān)閉Connection,否則會(huì)很耗服務(wù)器資源的。

  5.4 數(shù)據(jù)的顯示

  在這節(jié)的講解前,我們先建立一個(gè)數(shù)據(jù)庫,名字叫 aspnet 然后里面有一張表user 結(jié)構(gòu)如下:

uidusernameEmail
1 User1Mail1
2 User2Mail2
3 User3 Mail3

  SQL 語句 Select * From User

  數(shù)據(jù)庫語句 server=localhost;uid=sa;pwd=;database=aspnet

  5.4.1 用 DataReader 方法顯示數(shù)據(jù)

  有兩種方法可以顯示數(shù)據(jù) DataReader方法,和DataSet方法,而DataReader只能儲(chǔ)存查詢數(shù)據(jù),我們先講用DataReader方法顯示

<script language="VB" runat="server">
 Sub Page_Load(Src As Object, E As EventArgs)
  Dim MyConnection As SQLConnection =
     New SQLConnection("server=localhost;uid=sa;
               pwd=;database=aspnet")
  Dim MyCommand As SQLCommand =
     New SQLCommand("select * from User", MyConnection)
  MyConnection.Open()
  Dim DR As SQLDataReader
  MyCommand.Execute(DR)
  MyDataGrid.DataSource = DR
  MyDataGrid.DataBind()
  MyConnection.Close()
 End Sub
</script>
<ASP:DataGrid id="MyDataGrid" runat="server"
   Width="700"
   BackColor="#ccccff"
   BorderColor="black"
   ShowFooter="false"
   CellPadding=3
   CellSpacing="0"
   Font-Name="Verdana"
   Font-Size="8pt"
   HeaderStyle-BackColor="#aaaadd"
/>

  對(duì)于顯示的控制,大家可以復(fù)習(xí)一下前一講,數(shù)據(jù)的綁定,其實(shí)多聯(lián)系也是一種很好的方法。

  在定制顯示中,還有一種比較使用的方法,而不用綁定

Dim DR As SQLDataReader

  DR["字段名"]的方法也可以取到數(shù)據(jù)

  5.4.2 用 DataSet 方法顯示數(shù)據(jù)

  用DataSet記錄的數(shù)據(jù)其實(shí)就是一個(gè)表,而對(duì)表的操作,只是對(duì)DataSet的操作,并沒有改變數(shù)據(jù)庫,而要到DataSet更新的時(shí)候,才完整的寫入數(shù)據(jù)庫,這個(gè)往往是新手容易忽視的地方。

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>

<html>
<script language="VB" runat="server">

 Sub Page_Load(Src As Object, E As EventArgs)

  Dim DS As DataSet
  Dim MyConnection As SQLConnection
  Dim MyCommand As SQLDataSetCommand
  
  MyConnection = New
   SQLConnection("server=localhost;uid=sa;pwd=;database=aspnet")
  MyCommand =
   New SQLDataSetCommand("select * from User",MyConnection)

  DS = new DataSet()
   ~~~初始化DataSet()
  MyCommand.FillDataSet(ds, "User")
   ~~~FillDataSet顧名思義把整個(gè)查詢內(nèi)容儲(chǔ)存進(jìn)DataSet中
  MyDataGrid.DataSource=ds.Tables("User").DefaultView
  MyDataGrid.DataBind()
   ~~~綁定數(shù)據(jù)
 End Sub
</script>
<body>

。糷3><font face="Verdana">
  Simple Select to a DataGrid Control
</font></h3>

<ASP:DataGrid id="MyDataGrid" runat="server"
  Width="700"
  BackColor="#ccccff"
  BorderColor="black"
  ShowFooter="false"
  CellPadding=3
  CellSpacing="0"
  Font-Name="Verdana"
  Font-Size="8pt"
  HeaderStyle-BackColor="#aaaadd"
  MaintainState="false"
/>

</body>
</html>
  5.5 數(shù)據(jù)的添加,修改,和刪除

  其實(shí)他們是在就是簡單的不要再簡單的東西。

  添加:

DataRow dr=SQLDataSet.Tables["User"].NewRow();
dr["id"] = "4";
dr["username"] = "user4";
dr["Email"] = "mail4";
SQLDataSet.Tables.Rows.Add(dr);
修改:
SQLDataSet.Tables["user"].Rows[3]["username"]= "user5"
刪除:
SQLDataSet.Tables["user"].Rows[3].Delete()
修改完之后,必須更新數(shù)據(jù)庫
SQLCommand.Update(SQLDataSet, "user")

  5.6 關(guān)于顯示中的分頁問題

  這個(gè)問題,一再在論壇中給眾人提出過,曾經(jīng)是ASP中,一個(gè)比較難解決的問題,不過在ASP.net中,只不過是DataGrid的一個(gè)屬性而已。

  AllowPaging="True" 是否支持分頁

  PageSize="10" 每頁顯示多少

  PagerStyle-HorizontalAlign="Left" 分頁顯示的定位

  完整的例子:

<asp:DataGrid id="dataGrid1" runat="server"
  BorderColor="black"
  BorderWidth="1"
  GridLines="Both"
  CellPadding="3"
  CellSpacing="0"
  HeaderStyle-BackColor="#aaaadd"
  AllowPaging="True"
  PageSize="10"
  PagerStyle-HorizontalAlign="Left"/>