|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有个问题想请教你一下,呵呵:)你觉得将来学什么方向比较好,我真是想不出来,知道的太少了,麻烦了。asp.net|初级|数据<P> 后面我们提到,数据绑定控件把传送给数据源的值寄存在互相自力的Keys、Values(新值)和OldValues字典中。在默许情形下,SqlDataSource和ObjectDataSource会疏忽OldValues字段,只利用Keys和Values。这类举动是由数据源的ConflictDetection属性检测的,在默许情形下这个属性的值被设置为OverwriteChanges。OverwriteChanges形式意味着"为了更新或删除纪录,仅仅婚配主键值"。这类操纵意味着,纪录的更新或删除是不思索该纪录的上层值是不是改动过了。在一般情形下,幻想的形态是,只要当数据行的值与最后选择的值完整婚配的时分,才让Update或Delete操纵乐成。在这类幻想情形下,假如别的一个用户在你选择某一行和更新该行的之间也更新了这一行,你的更新操纵就会失利。经由过程把ConflictDetection属性设置为CompareAllValues,数据源也撑持这类操纵。在这类形式下,数据源会把OldValues使用到命令或办法上,它会利用这些值来确保在更新或删除纪录之前,更新或删除操纵必需与纪录的一切值都婚配。你还必需把OldValuesParameterFormatString属性设置为一个无效的.NET框架组件格局化字符串(比方"original_{0}"),来指明OldValues和Keys字典中的参数怎样从头定名以便与NewValues参数辨别开来。
上面的代码示例显现了SqlDataSource控件在OverwriteChanges和CompareAllValues形式下利用的典范的SQL命令。ID字段被假定为主键字段。请注重,前面一个命令在WHERE子句中对照数据行的一切原始值,而不是仅仅对照主键。在这类情形下,数据源的OldValuesParameterFormatString必要被设置为"original_{0}"。
SELECT[ID],[Name],[Address]from[Contacts]
--OverwriteChanges
UPDATE[Contacts]SET[Name]=@Name,[Address]=@AddressWHERE[ID]=@ID
DELETEFROM[Contacts]WHERE[ID]=@ID
--CompareAllValues
UPDATE[Contacts]SET[Name]=@Name,[Address]=@AddressWHERE[ID]=@original_ID
AND[Name]=@original_NameAND[Address]=@original_Address
DELETEFROM[Contacts]WHERE[ID]=@original_IDAND[Name]=@original_Name
AND[Address]=@original_Address
请注重,Insert操纵不必要OldValues,ConflictDetection只对Update和Delete操纵成心义。
上面的例子演示了抵触产生时的举动。为了运转这个例子,你必需在两个自力的扫瞄器窗口中翻开例子的两个实例(两次点击"RunSample")。接着在两个窗体的统一行上都点击"Edit"按钮,使该行进进编纂形式。在第一个窗口中改动一个值并点击"Update",请注重这个更新是乐成的。在第二个窗口中,在该行中输出一个新值并点击"Update",这个更新操纵没有乐成,由于上层数据行的值已被第一个更新操纵改动过了。这个示例检测了Updated或Deleted事务参数的AffectedRows属性,它为0确认了抵触产生了。
<scriptrunat="server">
ProtectedSubSqlDataSource1_Updated(senderAsObject,eAsSqlDataSourceStatusEventArgs)
Ife.AffectedRows=0Then
Response.Write("Rowchanged,updateaborted<br/>")
EndIf
EndSub
ProtectedSubSqlDataSource1_Deleted(senderAsObject,eAsSqlDataSourceStatusEventArgs)
Ife.AffectedRows=0Then
Response.Write("Rowchanged,deleteaborted<br/>")
EndIf
EndSub
</script>
当Update或Delete利用模板化UI的时分,利用了Bind语法的双向(two-way)数据绑定字段的旧值城市被保存。关于Delete来讲,这意味着在ItemTemplate中你必需给数据绑定的值利用Bind语法,其目标是为了保存删除操纵所必要的旧值。上面的例子演示了这类手艺。
<asp:GridView……>
<Columns>
<asp:CommandFieldShowDeleteButton="True"ShowEditButton="True"/>
<asp:TemplateFieldHeaderText="ContactID"InsertVisible="False"SortExpression="ContactID">
<ItemTemplate>
<asp:LabelID="Label1"runat="server"Text=<%#Bind("ContactID")%>></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:LabelID="Label3"runat="server"Text=<%#Eval("ContactID")%>></asp:Label>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateFieldHeaderText="ContactName"SortExpression="ContactName">
<ItemTemplate>
<asp:LabelID="Label2"runat="server"Text=<%#Bind("ContactName")%>></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBoxID="TextBox1"runat="server"Text=<%#Bind("ContactName")%>></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<P> 你能够和气地处置抵触检测毛病,能够经由过程提醒用户上层数据被改动了,向用户显现改动过的值,让用户选择提交或保持本人的操纵。上面的例子演示处置抵触检测的一种可行办法。请注重,DetailsView的RowUpdated事务参数传送了可用于检测用户输出的值的字典。你还能够设置这个事务参数的KeepInEditMode属性,利用户在决意怎样处置抵触时代,DetailsView处于编纂形式。这个例子所实验办法与下面一个例子相似,同时翻开两个窗口来创立抵触更新。
ProtectedSubDetailsView1_ItemUpdated(ByValsenderAsObject,ByValeAsSystem.Web.UI.WebControls.DetailsViewUpdatedEventArgs)
Ife.AffectedRows=0Then
使DetailsView处于编纂形式并与数据库同步
e.KeepInEditMode=True
DetailsView1.DataBind()
用用户输出的值从头添补DetailsView
DimtAsTextBox
t=DetailsView1.Rows(1).Cells(1).Controls(0)
t.Text=e.NewValues("OrderDate")
t=DetailsView1.Rows(2).Cells(1).Controls(0)
t.Text=e.NewValues("ShipCountry")
ErrorPanel.Visible=True
Else
ErrorPanel.Visible=False
EndIf
EndSub
ProtectedSubDetailsView1_ModeChanging(ByValsenderAsObject,ByValeAsSystem.Web.UI.WebControls.DetailsViewModeEventArgs)
Ife.CancelingEdit=TrueAndAlsoErrorPanel.Visible=TrueThen
ErrorPanel.Visible=False
EndIf
EndSub
利用ObjectDataSource的时分,情形也相似。请注重,因为数据源的ConflictDetection属性被设置为CompareAllValues,数据源将查找一个可承受Contact工具的每一个字段的原始值的UpdateContact重载。
你还能够同时利用DataObjectTypeName属性和CompareAllValues。在这类情形下,ObjectDataSource查找仅承受两个参数(都是Contact)的UpdateContact重载。第一个参数是寄存新值的Contact工具,第二个参数是寄存旧值的Contact工具。另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|