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

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

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

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

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

<script runat=server
Protected Sub EnumerateDictionary(ByVal dictionary As SystemCollectionsSpecializedIOrderedDictionary)
 Dim entry As DictionaryEntry
 For Each entry In dictionary
  ResponseWrite( <b> & ServerHtmlEncode(entryKey) & </b>= & ServerHtmlEncode(entryValue) & ( & ServerHtmlEncode(entryValueGetType()Name) & )<br />)
 Next
End Sub

Protected Sub EnumerateCommandParameters(ByVal command As SystemDataCommonDbCommand)
 ResponseWrite(<br/>Parameter order in data source<br />)
 Dim param As SystemDataCommonDbParameter
 For Each param In commandParameters
  ResponseWrite( <b> & ServerHtmlEncode(paramParameterName) & </b>= & ServerHtmlEncode(paramValue) & ( & ServerHtmlEncode(paramValueGetType()Name) & )<br />)
 Next
End Sub

Protected Sub DetailsView_ItemUpdating(ByVal sender As Object ByVal e As SystemWebUIWebControlsDetailsViewUpdateEventArgs)
 ResponseWrite(<br/>New Values passed from DetailsView<br />)
 EnumerateDictionary(eNewValues)
 ResponseWrite(<br/>Keys passed from DetailsView<br />)
 EnumerateDictionary(eKeys)
 
 ResponseWrite(<br/>Old Values passed from DetailsView<br />)
 EnumerateDictionary(eOldValues)
End Sub

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

<asp:SqlDataSource ConnectionString=<%$ ConnectionStrings:NorthwindOLEDB %> ID=SqlDataSource ProviderName=<%$ ConnectionStrings:NorthwindOLEDBProviderName %> runat=server SelectCommand=SELECT TOP [OrderID] [OrderDate] [ShipCountry] FROM [Orders] UpdateCommand=UPDATE [Orders] SET [OrderDate] = ? [ShipCountry] = ? WHERE [OrderID] = ? OnUpdating=SqlDataSource_Updating
<UpdateParameters>
 <asp:Parameter Name=OrderDate Type=DateTime />
 <asp:Parameter Name=ShipCountry Type=String />
 <asp:Parameter Name=OrderID Type=Int />
</UpdateParameters>
</asp:SqlDataSource>  參數命名習慣要求新值根據數據源Select操作所選定的字段來命名我們也可以通過指定OldValuesParameterFormatString屬性(例如指定為original_{})對Keys或OldValues中的參數進行重命名以便於把它們和NewValues參數區分開來你還可以通過處理適當的事件在數據源操作執行之前改變參數的值從而自定義參數名稱例如如果SqlDataSource的更新操作與一個存儲過程關聯而該存儲過程使用的參數名稱與默認的命名習慣不同那麼你就可以在該存儲過程被調用之前在SqlDataSource的Updating事件修改參數名稱下面的例子演示了這種技術

Protected Sub SqlDataSource_Updating(ByVal sender As Object ByVal e As SystemWebUIWebControlsSqlDataSourceCommandEventArgs)
 eCommandParameters(@id)Value = eCommandParameters(@ContactID)Value
 eCommandParameters(@name)Value = eCommandParameters(@ContactName)Value
 eCommandParametersRemove(eCommandParameters(@ContactID))
 eCommandParametersRemove(eCommandParameters(@ContactName))
End Sub

<asp:SqlDataSource ConnectionString=<%$ ConnectionStrings:Contacts %> ID=SqlDataSource runat=server SelectCommand=SELECT [ContactID] [ContactName] FROM [Contacts] UpdateCommand=UpdateContactName UpdateCommandType=StoredProcedure OnUpdating=SqlDataSource_Updating
<UpdateParameters>
 <asp:Parameter Name=id Type=Int />
 <asp:Parameter Name=name Type=String />
</UpdateParameters>
</asp:SqlDataSource>

  ObjectDataSource不依賴特定的參數次序而是簡單地查找與參數名稱相匹配的方法請注意ObjectDataSource不使用參數的類型或大小來分析方法重載它僅僅匹配參數名稱因此如果你的業務對象中的兩個方法擁有相同的名稱和參數名稱但是參數類型不同ObjectDataSource是無法把它們區分開的你可以在事件中改變ObjectDataSource參數的名稱和值這點與上面的SqlDataSource示例類似但是如果你使用DataObjectTypeName給UpdateInsert和Delete操作指定一個特殊的數據對象類型就不可以修改參數名稱了只能修改值如果你需要修改參數名稱就不要使用DataObjectTypeName只能用代碼在數據源事件中手動地構造適當的數據對象

  上面我們用到的所有數據源參數都是Input參數用於把值傳遞到數據源操作中參數可以是雙向的例如InputOutputOutput和ReturnValue參數你可以使用參數對象的Direction屬性來指定參數的方向如果需要在數據源操作完成之後檢索這些參數的值就需要處理適當的操作後(postoperation)事件(例如SelectedUpdatedInserted或Deleted事件)從傳遞到這些事件的事件參數中獲取參數值SqlDataSourceStatusEventArgs擁有Command屬性你可以使用它來獲取返回值和輸出參數如下面的例子所示請注意對於雙向參數來說把SqlDataSource中的Parameter對象的Size屬性設置為適當的值是非常重要的

<asp:SqlDataSource ID=SqlDataSource ……>
<SelectParameters>
 <asp:Parameter Direction=Output Name=TimeStamp Type=DateTime />
 <asp:Parameter Direction=ReturnValue Name=ReturnValue Type=Int />
</SelectParameters>
</asp:SqlDataSource>
  為了實現這個目標ObjectDataSourceStatusEventArgs類型支持OutputParameters集合和ReturnValue屬性如下面一個例子所示請注意在這種情況下Update操作的返回值是用於檢測操作所影響的行數的

Protected Sub ObjectDataSource_Selected(ByVal sender As Object ByVal e As ObjectDataSourceStatusEventArgs)
 ResponseWrite(Record Count: & ServerHtmlEncode(eOutputParameters(totalCount)))
End Sub

Protected Sub ObjectDataSource_Updated(ByVal sender As Object ByVal e As ObjectDataSourceStatusEventArgs)
 ResponseWrite(Rows Affected: & ServerHtmlEncode(eReturnValue) & <br/>)
End Sub

<asp:ObjectDataSource ID=ObjectDataSource ……>
 <UpdateParameters>
  <asp:Parameter Name=ContactName Type=String />
 </UpdateParameters>
 <SelectParameters>
  <asp:Parameter Direction=Output Name=totalCount Type=Int />
 </SelectParameters>
</asp:ObjectDataSource>
  輸出參數的另一種通常的用途是檢索插入數據庫的行的主鍵值而該主鍵列是一個標識列(在這種情況下在插入操作的參數中沒有指定鍵值該鍵值是在插入操作發生時數據庫服務器自動生成的)下面的例子演示了這種技術

Protected Sub SqlDataSource_Inserted(ByVal sender As Object ByVal e As SystemWebUIWebControlsSqlDataSourceStatusEventArgs)
 ResponseWrite(Record Inserted: & ServerHtmlEncode(eCommandParameters(@ContactID)Value) & <br/>)
End Sub

<asp:SqlDataSource ID=SqlDataSource ……>
 ……
 <InsertParameters>
  <asp:Parameter Name=contactName Type=String />
  <asp:Parameter Direction=Output Name=contactID Type=Int />
 </InsertParameters>
</asp:SqlDataSource>


From:http://tw.wingwit.com/Article/program/ASP/201311/21867.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.