|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
语言是不是不是最重要的?asp.net|初级|数据<P> 你能够处置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的。
<scriptrunat="server">
ProtectedSubEnumerateDictionary(ByValdictionaryAsSystem.Collections.Specialized.IOrderedDictionary)
DimentryAsDictionaryEntry
ForEachentryIndictionary
Response.Write("<b>"&Server.HtmlEncode(entry.Key)&"</b>="&Server.HtmlEncode(entry.Value)&"("&Server.HtmlEncode(entry.Value.GetType().Name)&")<br/>")
Next
EndSub
ProtectedSubEnumerateCommandParameters(ByValcommandAsSystem.Data.Common.DbCommand)
Response.Write("<br/>Parameterorderindatasource...<br/>")
DimparamAsSystem.Data.Common.DbParameter
ForEachparamIncommand.Parameters
Response.Write("<b>"&Server.HtmlEncode(param.ParameterName)&"</b>="&Server.HtmlEncode(param.Value)&"("&Server.HtmlEncode(param.Value.GetType().Name)&")<br/>")
Next
EndSub
ProtectedSubDetailsView1_ItemUpdating(ByValsenderAsObject,ByValeAsSystem.Web.UI.WebControls.DetailsViewUpdateEventArgs)
Response.Write("<br/>NewValuespassedfromDetailsView...<br/>")
EnumerateDictionary(e.NewValues)
Response.Write("<br/>KeyspassedfromDetailsView...<br/>")
EnumerateDictionary(e.Keys)
Response.Write("<br/>OldValuespassedfromDetailsView...<br/>")
EnumerateDictionary(e.OldValues)
EndSub
ProtectedSubSqlDataSource1_Updating(ByValsenderAsObject,ByValeAsSystem.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
EnumerateCommandParameters(e.Command)
e.Cancel=True
Response.Write("<br/>Updatecanceled")
EndSub
你能够经由过程向数据源利用的参数汇合增加静态的Parameter工具来改动SqlDataSource附加到命令上的参数序次。SqlDataSource会依据这些参数工具的序次来从头分列数据绑定控件所传送的参数。当数据源的ProviderName属性被设置为System.Data.OleDb的时分,这类操纵就有效处了,这是因为它不撑持定名(named)参数,因而附加到命令上的参数的序次必需与命令中的匿名参数占位符(?)的序次相婚配。当我们利用定名参数的时分,参数的序次就是可有可无的。你能够指定Parameter工具的Type属性,确保在实行命令或办法之前,强迫数据绑定控件传送的值被转换为得当的数据范例。一样地,你还能够设置Parameter的Size属性,划定SqlDataSource命令中DbParameter的位数巨细(必需用于输出/输入、输入和前往值参数)。
<asp:SqlDataSourceConnectionString="<%$ConnectionStrings:NorthwindOLEDB%>"ID="SqlDataSource1"ProviderName="<%$ConnectionStrings:NorthwindOLEDB.ProviderName%>"runat="server"SelectCommand="SELECTTOP10[OrderID],[OrderDate],[ShipCountry]FROM[Orders]"UpdateCommand="UPDATE[Orders]SET[OrderDate]=?,[ShipCountry]=?WHERE[OrderID]=?"OnUpdating="SqlDataSource1_Updating">
<UpdateParameters>
<asp:ParameterName="OrderDate"Type="DateTime"/>
<asp:ParameterName="ShipCountry"Type="String"/>
<asp:ParameterName="OrderID"Type="Int32"/>
</UpdateParameters>
</asp:SqlDataSource>
<P> 参数定名习气请求新值依据数据源Select操纵所选定的字段来定名。我们也能够经由过程指定OldValuesParameterFormatString属性(比方指定为"original_{0}")对Keys或OldValues中的参数举行重定名,以便于把它们和NewValues参数辨别开来。你还能够经由过程处置得当的事务,在数据源操纵实行之前改动参数的值,从而自界说参数称号。比方,假如SqlDataSource的更新操纵与一个存储历程联系关系,而该存储历程利用的参数称号与默许的定名习气分歧,那末你就能够在该存储历程被挪用之前,在SqlDataSource的Updating事务修正参数称号。上面的例子演示了这类手艺。
ProtectedSubSqlDataSource1_Updating(ByValsenderAsObject,ByValeAsSystem.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
e.Command.Parameters("@id").Value=e.Command.Parameters("@ContactID").Value
e.Command.Parameters("@name").Value=e.Command.Parameters("@ContactName").Value
e.Command.Parameters.Remove(e.Command.Parameters("@ContactID"))
e.Command.Parameters.Remove(e.Command.Parameters("@ContactName"))
EndSub
<asp:SqlDataSourceConnectionString="<%$ConnectionStrings:Contacts%>"ID="SqlDataSource1"runat="server"SelectCommand="SELECT[ContactID],[ContactName]FROM[Contacts]"UpdateCommand="UpdateContactName"UpdateCommandType="StoredProcedure"OnUpdating="SqlDataSource1_Updating">
<UpdateParameters>
<asp:ParameterName="id"Type="Int32"/>
<asp:ParameterName="name"Type="String"/>
</UpdateParameters>
</asp:SqlDataSource>
ObjectDataSource不依附特定的参数序次,而是复杂地查找与参数称号相婚配的办法。请注重,ObjectDataSource不利用参数的范例或巨细来剖析办法重载,它仅仅婚配参数称号,因而,假如你的营业工具中的两个办法具有不异的称号和参数称号,可是参数范例分歧,ObjectDataSource是没法把它们辨别开的。你能够在事务中改动ObjectDataSource参数的称号和值,这点与下面的SqlDataSource示例相似。可是,假如你利用DataObjectTypeName给Update、Insert和Delete操纵指定一个特别的数据工具范例,就不成以修正参数称号了--只能修正值。假如你必要修正参数称号,就不要利用DataObjectTypeName,只能用代码在数据源事务中手动地机关得当的数据工具。
下面我们用到的一切数据源参数都是Input参数,用于把值传送到数据源操纵中。参数能够是双向的,比方InputOutput、Output和ReturnValue参数。你可使用参数工具的Direction属性来指定参数的偏向。假如必要在数据源操纵完成以后检索这些参数的值,就必要处置得当的操纵后(post-operation)事务(比方Selected、Updated、Inserted或Deleted事务),从传送到这些事务的事务参数中猎取参数值。SqlDataSourceStatusEventArgs具有Command属性,你可使用它来猎取前往值和输入参数,以下面的例子所示。请注重,关于双向参数来讲,把SqlDataSource中的Parameter工具的Size属性设置为得当的值长短常主要的。
<asp:SqlDataSourceID="SqlDataSource1"……>
<SelectParameters>
<asp:ParameterDirection="Output"Name="TimeStamp"Type="DateTime"/>
<asp:ParameterDirection="ReturnValue"Name="ReturnValue"Type="Int32"/>
</SelectParameters>
</asp:SqlDataSource>
为了完成这个方针,ObjectDataSourceStatusEventArgs范例撑持OutputParameters汇合和ReturnValue属性,以下面一个例子所示。请注重,在这类情形下,Update操纵的前往值是用于检测操纵所影响的行数的。
ProtectedSubObjectDataSource1_Selected(ByValsenderAsObject,ByValeAsObjectDataSourceStatusEventArgs)
Response.Write("RecordCount:"&Server.HtmlEncode(e.OutputParameters("totalCount")))
EndSub
ProtectedSubObjectDataSource1_Updated(ByValsenderAsObject,ByValeAsObjectDataSourceStatusEventArgs)
Response.Write("RowsAffected:"&Server.HtmlEncode(e.ReturnValue)&"<br/>")
EndSub
<asp:ObjectDataSourceID="ObjectDataSource1"……>
<UpdateParameters>
<asp:ParameterName="ContactName"Type="String"/>
</UpdateParameters>
<SelectParameters>
<asp:ParameterDirection="Output"Name="totalCount"Type="Int32"/>
</SelectParameters>
</asp:ObjectDataSource>
输入参数的另外一种一般的用处是检索拔出数据库的行的主键值,而该主键列是一个标识列(在这类情形下,在拔出操纵的参数中没有指定键值,该键值是在拔出操纵产生时,数据库服务器主动天生的)。上面的例子演示了这类手艺。
ProtectedSubSqlDataSource1_Inserted(ByValsenderAsObject,ByValeAsSystem.Web.UI.WebControls.SqlDataSourceStatusEventArgs)
Response.Write("RecordInserted:"&Server.HtmlEncode(e.Command.Parameters("@ContactID").Value)&"<br/>")
EndSub
<asp:SqlDataSourceID="SqlDataSource1"……>
……
<InsertParameters>
<asp:ParameterName="contactName"Type="String"/>
<asp:ParameterDirection="Output"Name="contactID"Type="Int32"/>
</InsertParameters>
</asp:SqlDataSource>我也不知道,我原来理解的,NET就是C++编程,只是与JAVA相对,呵呵。以为.ET就是高级C++编程。 |
|