程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0高級數據處理之使用參數

ASP.NET 2.0高級數據處理之使用參數

編輯:關於ASP.NET

你可以處理Select、Update、Insert、Delete和Filter的事件,以驗證並處 理傳遞給這些操作的參數值。為了達到這個目標,數據綁定的控件和數據源控件 都暴露了適當的事件。例如,在GridView的Updating事件中,你就可以看到Keys 、NewValues和OldValues字典中的參數名稱和值,而它們將會被傳遞到數據源。 在數據源一端,你可以處理SqlDataSource的Updating事件,看到這些應用到下 層命令對象的參數,而這些命令將會執行以完成相關操作。類似的,你可以處理 ObjectDataSource的Updating事件來查看或改變參數字典,而這些字典將用於分 析UpdateMethod的適當操作。你可以使用這些事件來增加或刪除字典或命令的參 數、改變它們的值、或者簡單地驗證參數的輸入格式是否正確。

請注意:你尤其需要驗證Filtering事件的參數輸入,因為在它應用到相關的 DataView對象的FilterExpression(過濾器表達式)之前不會獲得SQL編碼 (encoded)。

下面的示例演示了處理多個數據控件的事件來枚舉那些通過事件參數傳遞的 參數集合。請注意,這個示例把與OrderID主鍵字段相關聯的綁定字段的 InsertVisible屬性設置為假,這是因為在下層數據庫中OrderID是一個標識列, 不應該傳遞給Insert操作(當插入發生的時候數據庫自動地增加這個值)。同時 請注意,在DataKeyNames中,OrderID字段被標記為主鍵,因此這個字段的原始 值保留在數據綁定控件所傳遞的Keys字典中。用戶輸入控件的值都傳遞進 NewValues字典(除了那些標記了ReadOnly=false的字段)。非鍵字段的原始值 由數據綁定控件保留在OldValues字典中,以供傳遞給數據源。這些參數值都被 SqlDataSource按照NewValues、Keys和OldValues的次序附加到命令上,盡管在 默認情況下,當ConflictDetection被設置為OverwriteChanges的時候,數據源 不會附加OldValues。你可以在後面的"使用沖突檢測"部分看到數據源是如何使 用OldValues的。

<script runat="server">
Protected Sub EnumerateDictionary(ByVal dictionary As System.Collections.Specialized.IOrderedDictionary)
  Dim entry As DictionaryEntry
  For Each entry In dictionary
Response.Write(" <b>" & Server.HtmlEncode(entry.Key) & "</b>=" & Server.HtmlEncode(entry.Value) & " (" & Server.HtmlEncode(entry.Value.GetType().Name) & ")<br />")
  Next
End Sub
Protected Sub EnumerateCommandParameters(ByVal command As System.Data.Common.DbCommand)
  Response.Write("<br/>Parameter order in data source...<br />")
  Dim param As System.Data.Common.DbParameter
  For Each param In command.Parameters
Response.Write(" <b>" & Server.HtmlEncode (param.ParameterName) & "</b>=" & Server.HtmlEncode (param.Value) & " (" & Server.HtmlEncode(param.Value.GetType ().Name) & ")<br />")
  Next
End Sub
Protected Sub DetailsView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs)
  Response.Write("<br/>New Values passed from DetailsView...<br />")
  EnumerateDictionary(e.NewValues)
  Response.Write("<br/>Keys passed from DetailsView...<br />")
  EnumerateDictionary(e.Keys)
 
  Response.Write("<br/>Old Values passed from DetailsView...<br />")
  EnumerateDictionary(e.OldValues)
End Sub
Protected Sub SqlDataSource1_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
  EnumerateCommandParameters(e.Command)
  e.Cancel = True
  Response.Write("<br/>Update canceled")
End Sub

你可以通過向數據源使用的參數集合添加靜態的Parameter對象來改變 SqlDataSource附加到命令上的參數次序。SqlDataSource會根據這些參數對象的 次序來重新排列數據綁定控件所傳遞的參數。當數據源的ProviderName屬性被設 置為System.Data.OleDb的時候,這種操作就有用處了,這是由於它不支持命名 (named)參數,因此附加到命令上的參數的次序必須與命令中的匿名參數占位 符('?')的次序相匹配。當我們使用命名參數的時候,參數的次序就是無關緊 要的。你可以指定Parameter對象的Type屬性,確保在執行命令或方法之前,強 制數據綁定控件傳遞的值被轉換為適當的數據類型。同樣地,你還可以設置 Parameter的Size屬性,規定SqlDataSource命令中DbParameter的位數大小(必 須用於輸入/輸出、輸出和返回值參數)。

<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:NorthwindOLEDB %>" ID="SqlDataSource1" ProviderName="<%$ ConnectionStrings:NorthwindOLEDB.ProviderName % >" runat="server" SelectCommand="SELECT TOP 10 [OrderID], [OrderDate], [ShipCountry] FROM [Orders]" UpdateCommand="UPDATE [Orders] SET [OrderDate] = ?, [ShipCountry] = ? WHERE [OrderID] = ?" OnUpdating="SqlDataSource1_Updating">
<UpdateParameters>
  <asp:Parameter Name="OrderDate" Type="DateTime" />
  <asp:Parameter Name="ShipCountry" Type="String" />
  <asp:Parameter Name="OrderID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved