通過(guò) SqlDataSource 控件,可以使用 Web 服務(wù)器控件訪問(wèn)位于關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)。其中可以包括 Microsoft SQL Server 和 Oracle 數(shù)據(jù)庫(kù)以及 OLE DB 和 ODBC 數(shù)據(jù)源。您可以將 SqlDataSource 控件與數(shù)據(jù)綁定控件(如 GridView、FormView 和 DetailsView 控件)一起使用,用極少代碼或甚至不用代碼來(lái)在 ASP.NET 網(wǎng)頁(yè)上顯示和操作數(shù)據(jù)。
1. 總述
SqlDataSource是基于ADO.net構(gòu)建的,會(huì)使用ADO.NET中的DataSet、DataReader和Command對(duì)象,我們看不見(jiàn)它們只不過(guò)是被封裝起來(lái)了。SqlDataSource是一個(gè)控件,所以允許以聲明控件的方式,而不是編程的方式使用這些ADO.NET對(duì)象。
SqlDataSource需要與其它數(shù)據(jù)綁定控件結(jié)合起來(lái),以顯示數(shù)據(jù)。關(guān)于數(shù)據(jù)綁定控件,見(jiàn)http://www.cnblogs.com/shipfi/archive/2009/10/15/1584054.html
2.一些常用的屬性
這些屬性不光可以在程序代碼中進(jìn)行設(shè)定,也可以在畫(huà)面中像使用控件方式一樣進(jìn)行設(shè)定。
2.1 ConnectionString屬性 : 獲取或設(shè)置特定于 ADO.NET 提供程序的連接字符串
如果是控件形式,可以在aspx頁(yè)面中進(jìn)行設(shè)定,代碼如下:
<!-- 連接字符串直接寫(xiě)入ConnectionString屬性中 -->
<asp:SqlDataSource ID="srcMovies" runat="server"
ConnectionString="Data Source=PC-200907130922;Initial Catalog=DawnEnterpriseDB;User ID=sa;Password=****" >
<!-- 連接字符串直接在web.config中 -->
<asp:SqlDataSource ID="srcMovies" runat="server"
ConnectionString="<%$ ConnectionStrings:DawnEnterpriseDBConnectionString %>" >
如果是編程方式,在aspx.cs中,代碼如下:
SqlDataSource srcMov = new SqlDataSource();
srcMov.ConnectionString =
WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"].ConnectionString;
2.2 ProviderName屬性:獲取或設(shè)置 .NET Framework 數(shù)據(jù)提供程序的名稱,使用該提供程序來(lái)連接基礎(chǔ)數(shù)據(jù)源。
如果不進(jìn)行設(shè)定,默認(rèn)的為 Microsoft SQL Server 的 ADO.NET 提供程序的名稱。
可以設(shè)定的值有:"System.Data.SqlClient"、"System.Data.OleDb"、"System.Data.Odbc"、"System.Data.OracleClient"
MSDN上記載:如果更改 ProviderName 屬性,會(huì)引發(fā) DataSourceChanged 事件,從而導(dǎo)致所有綁定到 SqlDataSource 的控件重新進(jìn)行綁定。
2.3 執(zhí)行四個(gè)SQL語(yǔ)句的Command及相應(yīng)的CommandType
●SelectCommand、InsertCommand、UpdateCommand、DeleteCommand
以上四個(gè)屬性都是String類型,可以提供SQL語(yǔ)句及存儲(chǔ)過(guò)程名稱。
如果是提供的存儲(chǔ)過(guò)程,則需要把相應(yīng)的SelectCommandType,InsertCommandType,UpdateCommandType,DeleteCommandType設(shè)定為"StoredProcedure"
2.4 進(jìn)行過(guò)濾的FilterExpression屬性
設(shè)定FilterExpression屬性,可以過(guò)濾控件返回的行,例如:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:DawnEnterpriseDBConnectionString %>"
SelectCommand="SELECT [product_id], [product_code], [product_name] FROM [product_main]”
FilterExpression=”Product_name like ‘{0}%’ ”
Runat=”server”>
<FilterParameters>
<asp:ControlParameter Name=”Title” ControlID=”txtTitle” />
</FilterParameters>
</asp:SqlDataSource>
2.5 改變數(shù)據(jù)源模型DataSourceMode屬性
可以改變數(shù)據(jù)源模型有:"DataReader",”DataSet”,默認(rèn)是DataSet.相比DataSet,DataReader可以更快速,但是,只有DataSet提供了緩存、過(guò)濾、分頁(yè)和排序功能
2.6 ASP.NET參數(shù)對(duì)象屬性
通常,SQL 語(yǔ)句和存儲(chǔ)過(guò)程包括運(yùn)行時(shí)計(jì)算的參數(shù)。使用參數(shù)編寫(xiě)的 SQL 語(yǔ)句稱作參數(shù)化 SQL 語(yǔ)句
ASP.NET 數(shù)據(jù)源控件可以接受輸入?yún)?shù),這樣就可以在運(yùn)行時(shí)將值傳遞給這些參數(shù)。
參數(shù)值可以從多種源中獲取。通過(guò) Parameter 對(duì)象,可以從 Web 服務(wù)器控件屬性、Cookie、會(huì)話狀態(tài)、QueryString 字段、用戶配置文件屬性及其他源中為參數(shù)化數(shù)據(jù)操作提供值。
相應(yīng)的參數(shù)對(duì)象包括:
● Parameter:表示任意一個(gè)靜態(tài)值
● ControlParameter:表示控件值或頁(yè)面的屬性值
● CookieParameter:表示瀏覽器的Cookie值
● FormParameter:表示一個(gè)HTML表單字段的值
● ProfileParameter:表示一個(gè)配置文件屬性值
● QueryStringParameter:表示一個(gè)查詢字符串字段中的值
● SessionParameter:表示一個(gè)存儲(chǔ)在會(huì)話狀態(tài)中的值
以上參數(shù)對(duì)象也具有相關(guān)屬性,包括ConvertEmptyStringToNull、DefaultValue、Direction、Name、Size、Type。參數(shù)對(duì)象可以顯式的聲明,對(duì)于GridView、DetailsView數(shù)據(jù)綁定控件,無(wú)需顯式的聲明參數(shù),原因是因?yàn)橐韵逻@句話的說(shuō)明:
如果 GridView 控件等數(shù)據(jù)綁定控件綁定到 SqlDataSource 控件,在執(zhí)行更新或刪除操作期間,該數(shù)據(jù)綁定控件會(huì)同時(shí)將當(dāng)前記錄值和原始記錄值傳遞到 SqlDataSource 控件。當(dāng)前值傳遞到 Values 字典中。原始值傳遞到 Keys 或 OldValues 字典中。對(duì)于給定的數(shù)據(jù)操作,這些字典的內(nèi)容將會(huì)追加到基礎(chǔ) DbCommand 對(duì)象的 Parameters 集合中。
更具體的詳見(jiàn)以下MSDN說(shuō)明:
●對(duì) SqlDataSource 控件使用參數(shù):ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/403ff44a-dd0b-484d-968e-dcd1dcd4c295.htm
●對(duì)數(shù)據(jù)源控件使用參數(shù): ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/88622d04-2989-484e-93fe-594cd98dcf5f.htm
●數(shù)據(jù)源控件如何為數(shù)據(jù)綁定字段創(chuàng)建參數(shù):ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/aa3f28c5-fd99-4978-8a66-c7709e0816c4.htm
2.7 緩存屬性EnableCaching與CacheDuration
EnableCaching屬性表示是否需要緩沖,CacheDuration表示緩存的失效時(shí)間。更多的緩存說(shuō)明,會(huì)另外進(jìn)行講述。
以下是MSDN中對(duì)于緩存的說(shuō)明:
當(dāng) EnableCaching 屬性設(shè)置為 true 且 CacheDuration 屬性設(shè)置為一個(gè)大于 0 的值(該值指示在放棄緩存項(xiàng)之前,緩存存儲(chǔ)數(shù)據(jù)的秒數(shù))時(shí),SqlDataSource 控件將自動(dòng)緩存數(shù)據(jù)。值 0 表示無(wú)限期緩存。
緩存的行為取決于持續(xù)時(shí)間和 CacheExpirationPolicy 屬性的組合。如果 CacheExpirationPolicy 屬性設(shè)置為 Absolute 值,則 SqlDataSource 將緩存第一次數(shù)據(jù)檢索操作的數(shù)據(jù),并將其保留在內(nèi)存中一段時(shí)間,這段時(shí)間最長(zhǎng)為 CacheDuration 屬性所指定的時(shí)間量。如果需要內(nèi)存,可以在持續(xù)時(shí)間結(jié)束前釋放數(shù)據(jù)。然后,緩存在下一操作期間被刷新。如果 CacheExpirationPolicy 屬性設(shè)置為 Sliding 值,數(shù)據(jù)源控件將緩存第一次數(shù)據(jù)檢索操作的數(shù)據(jù),但是對(duì)于后面的每個(gè)操作,它都重置保留緩存的時(shí)間窗口。自上次 Select 操作以后,如果在等于 CacheDuration 值的時(shí)間段內(nèi)沒(méi)有任何活動(dòng),緩存將過(guò)期。
僅當(dāng) SqlDataSource 控件處于 DataSet 模式時(shí),它才可緩存數(shù)據(jù)。如果 SqlDataSource 控件設(shè)置為 DataReader 值并且啟用了緩存,則 Select 方法將引發(fā) NotSupportedException 異常。
更多的MSDN說(shuō)明,請(qǐng)參見(jiàn):ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/fxref_system.web/html/5bfd5e37-43e6-8dca-4323-8454d465bd0b.htm
3. 詳敘sqlDataSource中的ASP.NET參數(shù)對(duì)象
本段落是對(duì)2.6節(jié)探討的ASP.NET參數(shù)對(duì)象的擴(kuò)充說(shuō)明,在2.6節(jié)說(shuō)過(guò),參數(shù)對(duì)象有Parameter、ControlParameter、CookieParameter…
這些asp.net參數(shù)對(duì)象有以下共通屬性:
● ConvertEmptyStringToNull : 當(dāng)值為真時(shí),如果參數(shù)接受一個(gè)空字符,空字符被轉(zhuǎn)換為NULL
● DefaultValue : 參數(shù)默認(rèn)值
● Direction : 參數(shù)方向,可以為INPUT、OUTPUT、InputOutput、ReturnValue
● Name : 參數(shù)名稱
● Size : 參數(shù)數(shù)據(jù)大小
● Type : 參數(shù)類型,可以為T(mén)ypeCode枚舉值
3.1 ControlParameter對(duì)象
ControlParmeter對(duì)象可以表示一個(gè)控件的屬性值。可以表示任意一個(gè)與SqlDataSource控件位于同一頁(yè)面的控件的值
除了具備父類Parameter所有的屬性外,還具備以下屬性:
● ControlID : 控件ID
● PropertyName : 獲取或設(shè)置由ControlParameter 對(duì)象綁定到的ControlID 屬性標(biāo)識(shí)的控件的屬性名
對(duì)于PropertyName, 這里說(shuō)明一下,假設(shè)需要從一個(gè)DropdownList1控件獲得參數(shù),關(guān)于DropdownList會(huì)有兩個(gè)值,一是SelectedText,一是 SelectValue.那是想要取參數(shù)時(shí)取DropdownList1.SelectedText值呢,還是 DropdownList1.SelectValue值?PropertyName就是設(shè)置控件的相應(yīng)屬性值,從控件的哪個(gè)屬性里取參數(shù)。對(duì)于 DropdownList控件,它的屬性還比較少。如果對(duì)于GridView控件,它的屬性就很多啦,包括PageIndex,Rows等等都可以作為參數(shù)來(lái)提取。Understand?
另外,對(duì)于PropertyName值并不必須要設(shè)定,如果不設(shè)定,控件參數(shù)對(duì)象會(huì)自動(dòng)查找ControlVlaueProperty屬性裝飾的屬性。 DropdownList控件的這個(gè)屬性就是SelectedValue。關(guān)于這點(diǎn),請(qǐng)參考:
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/fxref_system.web/html/f8be313f-8426-a7e7-904a-5a70cc816410.htm
例1:設(shè)置ControlParameter參數(shù)
<!--從DropdownList控件中提取參數(shù)-->
<asp:DropDownList id=”ddlMovies”
DataSourceID=”srcMovies” DataTextField=”Title” DataValueField=”Id” Runat=”server” />
<asp:SqlDataSource id=”srcMovieDetails”
SelectCommand=”SELECT * FROM Movies WHERE Id=@Id”
ConnectionString=”<%$ ConnectionStrings:Movies %>” Runat=”server”>
<SelectParameters>
<asp:ControlParameter Name=”Id” ControlID=”ddlMovies” PropertyName=”SelectedValue” />
</SelectParameters>
</asp:SqlDataSource>
還有一種方法,就是參數(shù)想取得cs代碼類中相應(yīng)變量作為參數(shù)的值,是否可以?其實(shí),作為cs中的類,是繼承自System.Web.UI.Page的對(duì)象,而Page類又是自Control類繼承,所以可以使用ControlParameter對(duì)象來(lái)表示Page屬性的值
例2:從Page對(duì)象屬性中取得相應(yīng)ControlParameter對(duì)象
<script runat=”server”>
public string IPAddress
{
get { return Request.UserHostAddress; }
}
</script>
<asp:SqlDataSource id=”srcGuestBook”
SelectCommand=”SELECT * FROM GuestBook ORDER BY Id DESC”
InsertCommand=”INSERT GuestBook (IPAddress,Name,Comments)
VALUES (@IPAddress,@Name, ConnectionString=”<%$ ConnectionStrings:GuestBook %>”
Runat=”server”>
<InsertParameters>
<asp:ControlParameter Name=”IPAddress” ControlID=”__page” PropertyName=”IPAddress” />
</InsertParameters>
</asp:SqlDataSource>
以上,表示本頁(yè)P(yáng)age的控件對(duì)象ID是__page,這個(gè)值是Page類自動(dòng)生的的ID。PropertyName的值為IPAddress,是在后臺(tái)代碼中定義的一個(gè)屬性。
例3:動(dòng)態(tài)在代碼中加入ControlParmeter對(duì)象
1private void Page_Load(object sender, System.EventArgs e)
2{
3 SqlDataSource sqlSource = new SqlDataSource(
4 ConfigurationManager.ConnectionStrings["MyNorthwind"].ConnectionString,
5 "SELECT FirstName, LastName FROM Employees WHERE Country = @country;");
6
7 ControlParameter country = new ControlParameter();
8 country.Name = "country";
9 country.Type = TypeCode.String;
10 country.ControlID = "DropDownList1";
11 country.PropertyName = "SelectedValue";
12
13 // If the DefaultValue is not set, the DataGrid does not
14 // display anything on the first page load. This is because
15 // on the first page load, the DropDownList has no
16 // selected item, and the ControlParameter evaluates to
17 // String.Empty.
18 country.DefaultValue = "USA";
19
20 sqlSource.SelectParameters.Add(country);
21
22 // Add the SqlDataSource to the page controls collection.
23 Page.Controls.Add(sqlSource);
24
25 DataGrid1.DataSource = sqlSource;
26 DataGrid1.DataBind();
27}
3.2 CookieParameter對(duì)象
CookieParameter對(duì)象表示瀏覽器端的Cookie,除了具備父類Parameter的所有屬性外,還具備以下屬性:
● CookieName : 瀏覽器cookie的名稱
例4:如何使用CookieParameter
<script runat=”server”>
void Page_Load()
{
if (Request.Cookies[“VoterId”] == null) {
// 創(chuàng)建VoterId Cookie對(duì)象
string identifier = Guid.NewGuid().ToString();
HttpCookie voteCookie = new HttpCookie(“VoterId”, identifier);
voteCookie.Expires = DateTime.MaxValue;
Response.AppendCookie(voteCookie);
}
}
</script>
<asp:FormView id=”frmVote” DataSourceID=”srcVote” DefaultMode=”Insert” Runat=”server”>
<InsertItemTemplate>
<asp:Label id=”lblFavoriteColor” AssociatedControlID=”rdlFavoriteColor” Runat=”server” />
<asp:RadioButtonList id=”rdlFavoriteColor” SelectedValue=’<%#Bind(“Color”)%>' Runat=”server”>
<asp:ListItem Value=”Red” Text=”Red” Selected=”True” />
<asp:ListItem Value=”Blue” Text=”Blue” />
<asp:ListItem Value=”Green” Text=”Green” />
</asp:RadioButtonList>
<asp:Button id=”btnSubmit” Text=”Submit” CommandName=”Insert” Runat=”server” />
</InsertItemTemplate>
</asp:FormView>
<asp:SqlDataSource id=”srcVote”
SelectCommand=”SELECT * FROM Vote ORDER BY Id DESC”
InsertCommand=”INSERT Vote (VoterId,Color) VALUES (@VoterId,@Color)”
<!--Color參數(shù)從FormView中得到,VoterId參數(shù)從Cookie中得到-->
ConnectionString=”<%$ ConnectionStrings:Vote %>” Runat=”server”>
<InsertParameters>
<asp:CookieParameter Name=”VoterId” CookieName=”VoterId” />
</InsertParameters>
</asp:SqlDataSource>
3.3 FormParameter對(duì)象
FormParameter對(duì)象表示一個(gè)提效給WEB服務(wù)器的表單字段,通常,在asp.net中不用像asp中需要直接處理瀏覽器中的表單,因?yàn)楸韱翁幚砉δ芤呀?jīng)封裝在表單控件中了。
例5:如何使用FormParameter
<script runat=”server”>
void Page_Load()
{
// 如果是點(diǎn)擊了AddMove按鈕
if (Request.Form[“AddMovie”] != null)
srcMovies.Insert(); // 觸發(fā)sqlDatasource的Insert事件
}
</script>
<body>
<form action=”ShowFormParameter.aspx” method=”post”> <!-- 需要提交的表單 -->
<label for=”txtTitle”>Movie Title:</label>
<input name=”txtTitle” />
<br />
<label for=”txtDirector”>Movie Director:</label>
<input name=”txtDirector” />
<br />
<input name=”AddMovie” type=”submit” value=”Add Movie” />
</form>
<form id=”form1” runat=”server”> <!--服務(wù)器Form控件 -->
<asp:GridView id=”grdMovies” DataSourceID=”srcMovies” Runat=”server” /> <!--GirdView控件,顯示數(shù)據(jù) -->
<asp:SqlDataSource id=”srcMovies” SelectCommand=”SELECT * FROM Movies”
InsertCommand=”INSERT Movies (Title,Director,CategoryId,DateReleased) VALUES (@Title,@Director,0,’12/25/1966’)”
ConnectionString=”<%$ ConnectionStrings:Movies %>” Runat=”server”>
<InsertParameters>
<asp:FormParameter Name=”Title” FormField=”txtTitle” DefaultValue=”Untitled” />
<asp:FormParameter Name=”Director” FormField=”txtDirector” DefaultValue=”Allen Smithee” />
</InsertParameters>
</asp:SqlDataSource>
</form>
</body>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowFormParameter.aspx.cs" Inherits="ShowFormParameter" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<html xmlns="<head>
<title></title>
</head>
<body>
<form action="ShowFormParameter.aspx" method="post"> <!-- 需要提交的表單 -->
<label for="txtName">Movie Title:</label>
<input name="txtName" />
<br />
<label for="txtDirector">Movie Director:</label>
<input name="txtDirector" />
<br />
<input name="AddMovie" type="submit" value="Add Movie" />
</form>
<form id="form1" runat="server"> <!--服務(wù)器Form控件 -->
<asp:GridView id="grdMovies" DataSourceID="SqlDataSource1" runat="server" /> <!--GirdView控件,顯示數(shù)據(jù) -->
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:sssConnectionString %>"
DeleteCommand="DELETE FROM [K] WHERE [id] = @id"
InsertCommand="INSERT INTO [K] ( [name], [keyname]) VALUES ( @name, @keyname)"
SelectCommand="SELECT * FROM [K] WHERE ([name] = @name)"
UpdateCommand="UPDATE [K] SET [name] = @name, [keyname] = @keyname WHERE [id] = @id">
<SelectParameters>
<asp:FormParameter DefaultValue="CHEN" FormField="txtName" Name="name" Type="String" />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="name" Type="String" />
<asp:Parameter Name="keyname" Type="String" />
<asp:Parameter Name="id" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter Name="name" Type="String" />
<asp:Parameter Name="keyname" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
</form>
</body>
3.4 ProfileParameter對(duì)象
ProfileParameter對(duì)象可以用來(lái)提取web.config中的Profile屬性,ProfileParameter除包含Parameter基類的所有屬性外,還具備以下屬性:
● ProfileName: Profile屬性的名稱
例6:如何使用ProfileParameter對(duì)象
<!-- web.config配置 -->
<system.web>
<profile enabled=”true”>
<properties>
<add name=”DisplayName” defaultValue=”Anonymous” />
</properties>
</profile>
</system.web>
<!-- aspx處理頁(yè)面 –>
<!-- 留言版的輸入框 -->
<asp:FormView id=”frmGuestBook” DataSourceID=”srcGuestBook” DefaultMode=”Insert” Runat=”server”>
<InsertItemTemplate>
<asp:Label id=”lblComments” Text=”Enter Your Comments:” Runat=”server” /> <br />
<asp:TextBox id=”txtComments” Text=’<%# Bind(“Comments”) %>' TextMode=”MultiLine” Columns=”50”
Rows=”4” Runat=”server” /> <br />
<asp:Button id=”btnInsert” Text=”Add Comments” CommandName=”Insert” Runat=”server” />
</InsertItemTemplate>
</asp:FormView>
<!-- SqlDataSource處理 -->
<asp:SqlDataSource id=”srcGuestBook”
SelectCommand=”SELECT Name,Comments,EntryDate FROM GuestBook ORDER BY Id DESC”
InsertCommand=”INSERT GuestBook (Name,Comments) VALUES (@Name,@Comments)”
ConnectionString=”<%$ ConnectionStrings:GuestBook %>” Runat=”server”>
<InsertParameters>
<asp:ProfileParameter Name=”Name” PropertyName=”DisplayName” />
</InsertParameters>
</asp:SqlDataSource>
3.5 QueryStringParameter對(duì)象
QueryStringParameter對(duì)象可以表示傳遞給頁(yè)面的任何查詢字符串,QueryStringParameter除包含Parameter基類的所有屬性外,還具備以下屬性:
● QueryStringField: 所表示查詢字符串的名稱
例7:如何使用QueryStringField對(duì)象
<!-- 鏈接頁(yè)面 -->
<asp:GridView id=”grdMovies” DataSourceId=”srcMovies” AutoGenerateColumns=”false”
ShowHeader=”false” Runat=”server”>
<Columns>
<asp:HyperLinkField DataTextField=”Title” DataNavigateUrlFields=”Id”
DataNavigateUrlFormatString=”ShowQueryStringParameterDetails.aspx?id={0}” />
</Columns>
</asp:GridView>
<asp:SqlDataSource id=”srcMovies” SelectCommand=”SELECT * FROM Movies”
ConnectionString=”<%$ ConnectionStrings:Movies %>” Runat=”server” />
<!-- 鏈接后的處理頁(yè)面 -->
<asp:SqlDataSource id=”srcMovie”
SelectCommand=”SELECT * FROM Movies WHERE Id=@Id”
ConnectionString=”<%$ ConnectionStrings:Movies %>” Runat=”server”>
<SelectParameters>
<asp:QueryStringParameter Name=”Id” QueryStringField=”Id” />
</SelectParameters>
</asp:SqlDataSource>
3.6 SessionParameter對(duì)象
SessionParameter對(duì)象表示存儲(chǔ)在Session狀態(tài)中的項(xiàng)目,SessionParameter除包含Parameter基類的所有屬性外,還具備以下屬性:
● SessionField: 所表示會(huì)話狀態(tài)中的項(xiàng)目名稱
例8:如何使用SessionParameter對(duì)象
<script runat=”server”>
void Page_Load()
{
Session[“MovieCategoryName”] = “Animation”;
}
</script>
<asp:SqlDataSource id=”srcMovies”
SelectCommand=”SELECT Name As Category,Title,Director FROM Movies
INNER JOIN MovieCategories ON CategoryId = MovieCategories.id
WHERE Name=@Name”
ConnectionString=”<%$ ConnectionStrings:Movies %>” Runat=”server”>
<SelectParameters>
<asp:SessionParameter Name=”Name” SessionField=”MovieCategoryName” />
</SelectParameters>
</asp:SqlDataSource>
4. 通過(guò)程序控制SqlDataSource對(duì)象
SqlDataSource控件一般都與數(shù)據(jù)綁定控件一起使用,在本節(jié)中,可以知道、
● 如何通過(guò)在代碼中直接使用SqlDataSource控件的屬性和方法來(lái)創(chuàng)建參數(shù)、
● 如何執(zhí)行選擇、插入、更新和刪除命令
4.1 添加ADO.NET參數(shù)
SqlDataSource并沒(méi)有直接與數(shù)據(jù)交互,它是通過(guò)ADO.NET對(duì)象與數(shù)據(jù)庫(kù)交互的。當(dāng)和SqlDataSource控件一起使用時(shí),所有聲明的ASP.NET參數(shù)也應(yīng)轉(zhuǎn)換成相應(yīng)的ADO.NET參數(shù)
在某些情況下,希望直接處理ADO.NET參數(shù),可以通過(guò)在執(zhí)行相應(yīng)的命令前通過(guò)程序增加額外的ADO.NET參數(shù)
例9:通過(guò)程序增加SqlDataSource的SelectCommand參數(shù)
<script runat=”server”>
protected void srcGuestBook_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
// SqlDataSourceCommandEventArgs 為 SqlDataSource 控件的 Updating、Deleting 和 Inserting 事件提供數(shù)據(jù)。
// MSDN上這樣解釋SqlDataSourceCommandEventArgs參數(shù):
/* 因?yàn)?SqlDataSourceCommandEventArgs 類是從 CancelEventArgs 類派生的,所以可以通過(guò)將 Cancel 屬性設(shè)置為 true,
取消掛起的 SqlDataSource 數(shù)據(jù)庫(kù)命令。通過(guò)訪問(wèn)由 Command 屬性公開(kāi)的 DbCommand 對(duì)象,可以在運(yùn)行此命令之前,
檢查和操作 CommandText、Parameters 集合以及其他命令屬性。*/
e.Command.Parameters.Add(new SqlParameter(“@Name”, User.Identity.Name)); // 為Insert操作添加一個(gè)參數(shù)
}
</script>
<!-- aspx處理頁(yè)面 –>
<!-- 留言版的輸入框 -->
<asp:FormView id=”frmGuestBook” DataSourceID=”srcGuestBook” DefaultMode=”Insert” Runat=”server”>
<InsertItemTemplate>
<asp:Label id=”lblComments” Text=”Enter Your Comments:” Runat=”server” /> <br />
<asp:TextBox id=”txtComments” Text=’<%# Bind(“Comments”) %>' TextMode=”MultiLine” Columns=”50”
Rows=”4” Runat=”server” /> <br />
<asp:Button id=”btnInsert” Text=”Add Comments” CommandName=”Insert” Runat=”server” />
</InsertItemTemplate>
</asp:FormView>
<!-- SqlDataSource處理 -->
<asp:SqlDataSource id=”srcGuestBook”
SelectCommand=”SELECT Name,Comments,EntryDate FROM GuestBook ORDER BY Id DESC”
InsertCommand=”INSERT GuestBook (Name,Comments) VALUES (@Name,@Comments)”
ConnectionString=”<%$ ConnectionStrings:GuestBook %>” Runat=”server” OnInserting=”srcGuestBook_Inserting”>
<!-- 與例6不同的是,這里無(wú)需添加相應(yīng)的參數(shù)對(duì)象,參數(shù)對(duì)象通過(guò)srcGuestBook_Inserting事件進(jìn)行追加 -->
</asp:SqlDataSource>
另外,需要說(shuō)明的是,Inserting、Updating、Deleting操作傳遞給函數(shù)的都是SqlDataSourceCommandEventArgs參數(shù),但Filtering傳遞給函數(shù)的卻是SqlDataSourceFilteringEventArgs對(duì)象,使用以下方法取得已和設(shè)定的參數(shù):
protected void SqlDataSource1_Filtering(object sender, SqlDataSourceFilteringEventArgs e)
{
if (e.ParameterValues.Count > 0)
{
Label1.Text = e.ParameterValues[0].ToString();
}
if (Textbox1.Text == "")
{ // 添加參數(shù):第一個(gè)為參數(shù)名,第二個(gè)為參數(shù)Value。
e.ParameterValues.Clear();
e.ParameterValues.Add("FullName", "Nancy Davolio");
}
}
4.2 執(zhí)行Insert、Update、Delete命令
其實(shí),執(zhí)行相應(yīng)的命令,只要調(diào)用SqlDataSource對(duì)象的Insert()、Update()、Delete()方法就可以了。
例10:通過(guò)程序,執(zhí)行SqlDataSource Insert命令
<script runat=”server”>
protected void btnAddEntry_Click(object sender, EventArgs e)
{
srcGuestBook.InsertParameters[“Name”].DefaultValue = txtName.Text;
srcGuestBook.InsertParameters[“Comments”].DefaultValue = txtComments.Text;
srcGuestBook.Insert();
}
</script>
<asp:TextBox id=”txtName” Runat=”server” /> <!-- 輸入值1 -->
<asp:TextBox id=”txtComments” TextMode=”MultiLine”
Columns=”50” Rows=”2” Runat=”server” /> <!-- 輸入值2 -->
<asp:Button id=”btnAddEntry” Text=”Add Entry” Runat=”server” OnClick=”btnAddEntry_Click” />
<asp:SqlDataSource id=”srcGuestBook” ConnectionString=”<%$ ConnectionStrings:GuestBook %>”
SelectCommand=”SELECT Name,Comments FROM GuestBook ORDER BY Id DESC”
InsertCommand=”INSERT GuestBook (Name,Comments) VALUES (@Name,@Comments)”
Runat=”server”>
<InsertParameters>
<asp:Parameter Name=”Name” />
<asp:Parameter Name=”Comments” />
</InsertParameters>
</asp:SqlDataSource>
4.3 執(zhí)行Select命令
執(zhí)行Select命令與其它命令不同,因?yàn)镾elect需要返回?cái)?shù)據(jù)。SqlDataSource的Select方法返回一個(gè)實(shí)現(xiàn)IEnumerable的接口,DataView和DataReader都實(shí)現(xiàn)了這個(gè)接口,可以創(chuàng)建一個(gè)DataView或DataReader對(duì)象接受該數(shù)據(jù)。