ASP.NET講座(5)-數(shù)據(jù)庫的設(shè)置ADO.NET
發(fā)表時間:2024-02-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]自若干年前推出開放式數(shù)據(jù)庫連接 (ODBC) 應(yīng)用程序編程接口 (API) 以來,出現(xiàn)了各種各樣的數(shù)據(jù)庫訪問技術(shù),而 ADO.NET 是其中最新的一種。在這過程中,發(fā)生了許多有趣的事。例如,COM 闖入數(shù)據(jù)庫領(lǐng)域,開始培植 OLE DB 的殖民進程。然后,大致相當(dāng)于 OLE DB 自動化版本的 A...
自若干年前推出開放式數(shù)據(jù)庫連接 (ODBC) 應(yīng)用程序編程接口 (API) 以來,出現(xiàn)了各種各樣的數(shù)據(jù)庫訪問技術(shù),而 ADO.NET 是其中最新的一種。在這過程中,發(fā)生了許多有趣的事。例如,COM 闖入數(shù)據(jù)庫領(lǐng)域,開始培植 OLE DB 的殖民進程。然后,大致相當(dāng)于 OLE DB 自動化版本的 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)在需要通過各個 COM 對象分別獲得。在這些庫中,您會發(fā)現(xiàn) XML 和 ADO 對象模型,它們被集成到了叫做 ADO.NET 的類子樹中。
ADO.NET 事實上成為構(gòu)建數(shù)據(jù)感知 .NET 應(yīng)用程序的基礎(chǔ)。和 ADO 不同的是,ADO.NET 遵循更通用的原則,不那么專門面向數(shù)據(jù)庫。ADO.NET 集合了所有允許數(shù)據(jù)處理的類。這些類表示具有典型數(shù)據(jù)庫功能(如索引、排序和視圖)的數(shù)據(jù)容器對象。盡管 ADO.NET 是 .NET 數(shù)據(jù)庫應(yīng)用程序的權(quán)威解決方案,但從總體設(shè)計上來看,它不象 ADO 模型那樣以數(shù)據(jù)庫為中心,這是 ADO.NET 的一大特點。
ADO.NET 與 ADO 有很大差異。ADO.NET 是新的數(shù)據(jù)訪問編程模型,需要開發(fā)人員的全面理解、投入和新思維。然而,一旦開始掌握 ADO.NET,您將意識到:原有的 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 表,因為它們直接進入數(shù)據(jù)庫服務(wù)器的內(nèi)部 API,跳過了由 OLE DB 提供程序表示的中間層。ADO 類是 OLE DB 提供程序上的 .NET 接口,它們使用 COM Interop 橋進行工作。
5.2 連接一個數(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超時
DataBase 缺省數(shù)據(jù)庫
DataSource DNS
UserID 原來叫UID
Password
State 取得目前連接的狀態(tài)
Open() 打開
Close() 關(guān)閉
5.3 操作數(shù)據(jù)庫
通過一個Command對象,我們才可以對數(shù)據(jù)庫進行操作
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語句或儲存過程(StoredProcedure)名
CommandTimeout 超時
CommandType Command操作的類型(StoredProcedure,Text,TableDirect)三種,默認Text
Parameters 操作儲存過程時使用
Execute() 執(zhí)行SQL語句或儲存過程
ExecuteNonQuery() 同上,但無返回,或者說,只返回記錄的數(shù)量
注意: 和ASP一樣,在運行完以后一定要注意關(guān)閉Connection,否則會很耗服務(wù)器資源的。
5.4 數(shù)據(jù)的顯示
在這節(jié)的講解前,我們先建立一個數(shù)據(jù)庫,名字叫 aspnet 然后里面有一張表user 結(jié)構(gòu)如下:
uid | username | Email |
1 | User1 | Mail1 |
2 | User2 | Mail2 |
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只能儲存查詢數(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"
/>
對于顯示的控制,大家可以復(fù)習(xí)一下前一講,數(shù)據(jù)的綁定,其實多聯(lián)系也是一種很好的方法。
在定制顯示中,還有一種比較使用的方法,而不用綁定
Dim DR As SQLDataReader
DR["字段名"]的方法也可以取到數(shù)據(jù)
5.4.2 用 DataSet 方法顯示數(shù)據(jù)
用DataSet記錄的數(shù)據(jù)其實就是一個表,而對表的操作,只是對DataSet的操作,并沒有改變數(shù)據(jù)庫,而要到DataSet更新的時候,才完整的寫入數(shù)據(jù)庫,這個往往是新手容易忽視的地方。
<%@ 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顧名思義把整個查詢內(nèi)容儲存進DataSet中
MyDataGrid.DataSource=ds.Tables("User").DefaultView
MyDataGrid.DataBind()
~~~綁定數(shù)據(jù)
End Sub
</script>
<body>
<h3><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ù)的添加,修改,和刪除
其實他們是在就是簡單的不要再簡單的東西。
添加:
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)于顯示中的分頁問題
這個問題,一再在論壇中給眾人提出過,曾經(jīng)是ASP中,一個比較難解決的問題,不過在ASP.net中,只不過是DataGrid的一個屬性而已。
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"/>