¡¡¡¡Ç°ÃæÎÒÃÇÌáµ½£¬Êý¾Ý°ó¶¨¿Ø¼þ°Ñ´«µÝ¸øÊý¾ÝÔ´µÄÖµ´æ·ÅÔÚÏ໥¶ÀÁ¢µÄKeys¡¢Values£¨ÐÂÖµ£©ºÍ OldValues×ÖµäÖС£ÔÚĬÈÏÇé¿öÏ£¬SqlDataSourceºÍObjectDataSource»áºöÂÔOldValues×ֶΣ¬Ö»Ê¹ÓÃKeysºÍValues¡£ÕâÖÖÐÐΪÊÇÓÉÊý¾ÝÔ´µÄConflictDetectionÊôÐÔ¼ì²âµÄ£¬ÔÚĬÈÏÇé¿öÏÂÕâ¸öÊôÐÔµÄÖµ±»ÉèÖÃΪOverwriteChanges¡£OverwriteChangesģʽÒâζ×Å"ΪÁ˸üлòɾ³ý¼Ç¼£¬½ö½öÆ¥ÅäÖ÷¼üÖµ"¡£ÕâÖÖ²Ù×÷Òâζ×Å£¬¼Ç¼µÄ¸üлòɾ³ýÊDz»¿¼ÂǸüǼµÄϲãÖµÊÇ·ñ¸Ä±ä¹ýÁË¡£ÔÚͨ³£Çé¿öÏ£¬ÀíÏëµÄ״̬ÊÇ£¬Ö»Óе±Êý¾ÝÐеÄÖµÓë×î³õÑ¡ÔñµÄÖµÍêȫƥÅäµÄʱºò£¬²ÅÈÃUpdate»òDelete²Ù×÷³É¹¦¡£ÔÚÕâÖÖÀíÏëÇé¿öÏ£¬Èç¹ûÁíÍâÒ»¸öÓû§ÔÚÄãÑ¡ÔñijһÐк͸üиÃÐеÄÖ®¼äÒ²¸üÐÂÁËÕâÒ»ÐУ¬ÄãµÄ¸üвÙ×÷¾Í»áʧ°Ü¡£Í¨¹ý°ÑConflictDetectionÊôÐÔÉèÖÃΪCompareAllValues£¬Êý¾ÝÔ´Ò²Ö§³ÖÕâÖÖ²Ù×÷¡£ÔÚÕâÖÖģʽÏ£¬Êý¾ÝÔ´»á°ÑOldValuesÓ¦Óõ½ÃüÁî»ò·½·¨ÉÏ£¬Ëü»áʹÓÃÕâЩֵÀ´È·±£ÔÚ¸üлòɾ³ý¼Ç¼֮ǰ£¬¸üлòɾ³ý²Ù×÷±ØÐëÓë¼Ç¼µÄËùÓÐÖµ¶¼Æ¥Åä¡£Ä㻹±ØÐë°ÑOldValuesParameterFormatStringÊôÐÔÉèÖÃΪһ¸öÓÐЧµÄ.NET¿ò¼Ü×é¼þ¸ñʽ»¯×Ö·û´®£¨ÀýÈç"original_{0}"£©£¬À´Ö¸Ã÷OldValuesºÍKeys×ÖµäÖеIJÎÊýÈçºÎÖØÐÂÃüÃûÒÔ±ãÓëNewValues²ÎÊýÇø·Ö¿ªÀ´¡£

¡¡¡¡ÏÂÃæµÄ´úÂëʾÀýÏÔʾÁËSqlDataSource¿Ø¼þÔÚOverwriteChangesºÍCompareAllValuesģʽÏÂʹÓõĵäÐ͵ÄSQLÃüÁî¡£ID×ֶα»¼Ù¶¨ÎªÖ÷¼ü×ֶΡ£Çë×¢Ò⣬ºóÃæÒ»¸öÃüÁîÔÚWHERE×Ó¾äÖбȽÏÊý¾ÝÐеÄËùÓÐԭʼֵ£¬¶ø²»Êǽö½ö±È½ÏÖ÷¼ü¡£ÔÚÕâÖÖÇé¿öÏ£¬Êý¾ÝÔ´µÄOldValuesParameterFormatStringÐèÒª±»ÉèÖÃΪ"original_{0}"¡£

SELECT [ID], [Name], [Address] from [Contacts]
-- OverwriteChanges
UPDATE [Contacts] SET [Name] = @Name, [Address] = @Address WHERE [ID] = @ID
DELETE FROM [Contacts] WHERE [ID] = @ID

-- CompareAllValues
UPDATE [Contacts] SET [Name] = @Name, [Address] = @Address WHERE [ID] = @original_ID
AND [Name] = @original_Name AND [Address] = @original_Address
DELETE FROM [Contacts] WHERE [ID] = @original_ID AND [Name] = @original_Name
AND [Address] = @original_Address

¡¡¡¡Çë×¢Ò⣬Insert²Ù×÷²»ÐèÒªOldValues£¬ConflictDetectionÖ»¶ÔUpdateºÍDelete²Ù×÷ÓÐÒâÒå¡£

¡¡¡¡ÏÂÃæµÄÀý×ÓÑÝʾÁ˳åÍ»·¢ÉúʱµÄÐÐΪ¡£ÎªÁËÔËÐÐÕâ¸öÀý×Ó£¬Äã±ØÐëÔÚÁ½¸ö¶ÀÁ¢µÄä¯ÀÀÆ÷´°¿ÚÖдò¿ªÀý×ÓµÄÁ½¸öʵÀý£¨Á½´Îµã»÷"Run Sample"£©¡£½Ó×ÅÔÚÁ½¸ö´°ÌåµÄͬһÐÐÉ϶¼µã»÷"Edit"°´Å¥£¬Ê¹¸ÃÐнøÈë±à¼­Ä£Ê½¡£ÔÚµÚÒ»¸ö´°¿ÚÖиıäÒ»¸öÖµ²¢µã»÷"Update"£¬Çë×¢ÒâÕâ¸ö¸üÐÂÊdzɹ¦µÄ¡£ÔÚµÚ¶þ¸ö´°¿ÚÖУ¬ÔÚ¸ÃÐÐÖÐÊäÈëÒ»¸öÐÂÖµ²¢µã»÷"Update"£¬Õâ¸ö¸üвÙ×÷ûÓгɹ¦£¬ÒòΪϲãÊý¾ÝÐеÄÖµÒѾ­±»µÚÒ»¸ö¸üвÙ×÷¸Ä±ä¹ýÁË¡£Õâ¸öʾÀý¼ì²âÁËUpdated»òDeletedʼþ²ÎÊýµÄAffectedRowsÊôÐÔ£¬ËüΪ0È·ÈÏÁ˳åÍ»·¢ÉúÁË¡£

£¼script runat="server"£¾
Protected Sub SqlDataSource1_Updated(sender As Object, e As SqlDataSourceStatusEventArgs)
¡¡If e.AffectedRows = 0 Then
¡¡¡¡Response.Write("Row changed, update aborted£¼br /£¾")
¡¡End If
End Sub

Protected Sub SqlDataSource1_Deleted(sender As Object, e As SqlDataSourceStatusEventArgs)
¡¡If e.AffectedRows = 0 Then
¡¡¡¡Response.Write("Row changed, delete aborted£¼br /£¾")
¡¡End If
End Sub
£¼/script£¾

¡¡¡¡µ±Update»òDeleteʹÓÃÄ£°å»¯UIµÄʱºò£¬Ê¹ÓÃÁËBindÓï·¨µÄË«Ïò£¨two-way£©Êý¾Ý°ó¶¨×ֶεľÉÖµ¶¼»á±»±£Áô¡£¶ÔÓÚDeleteÀ´Ëµ£¬ÕâÒâζ×ÅÔÚItemTemplateÖÐÄã±ØÐë¸øÊý¾Ý°ó¶¨µÄֵʹÓÃBindÓï·¨£¬ÆäÄ¿µÄÊÇΪÁ˱£Áôɾ³ý²Ù×÷ËùÐèÒªµÄ¾ÉÖµ¡£ÏÂÃæµÄÀý×ÓÑÝʾÁËÕâÖÖ¼¼Êõ¡£

£¼asp:GridView ¡­¡­£¾
¡¡£¼Columns£¾
¡¡¡¡£¼asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /£¾
¡¡¡¡£¼asp:TemplateField HeaderText="ContactID" InsertVisible="False" SortExpression="ContactID"£¾
¡¡¡¡¡¡£¼ItemTemplate£¾
¡¡¡¡¡¡¡¡£¼asp:Label ID="Label1" runat="server" Text='£¼%# Bind("ContactID") %£¾'£¾£¼/asp:Label£¾
¡¡¡¡¡¡£¼/ItemTemplate£¾
¡¡¡¡¡¡£¼EditItemTemplate£¾
¡¡¡¡¡¡¡¡£¼asp:Label ID="Label3" runat="server" Text='£¼%# Eval("ContactID") %£¾'£¾£¼/asp:Label£¾
¡¡¡¡¡¡£¼/EditItemTemplate£¾
¡¡¡¡£¼/asp:TemplateField£¾
¡¡¡¡£¼asp:TemplateField HeaderText="ContactName" SortExpression="ContactName"£¾
¡¡¡¡¡¡£¼ItemTemplate£¾
¡¡¡¡¡¡¡¡£¼asp:Label ID="Label2" runat="server" Text='£¼%# Bind("ContactName") %£¾'£¾£¼/asp:Label£¾
¡¡¡¡¡¡£¼/ItemTemplate£¾
¡¡¡¡¡¡£¼EditItemTemplate£¾
¡¡¡¡¡¡¡¡£¼asp:TextBox ID="TextBox1" runat="server" Text='£¼%# Bind("ContactName") %£¾'£¾£¼/asp:TextBox£¾
¡¡¡¡¡¡£¼/EditItemTemplate£¾
¡¡¡¡£¼/asp:TemplateField£¾
¡¡£¼/Columns£¾
£¼/asp:GridView£¾

¡¡¡¡Äã¿ÉÒÔκ͵ش¦Àí³åÍ»¼ì²â´íÎ󣬿ÉÒÔͨ¹ýÌáʾÓû§Ï²ãÊý¾Ý±»¸Ä±äÁË£¬ÏòÓû§ÏÔʾ¸Ä±ä¹ýµÄÖµ£¬ ÈÃÓû§Ñ¡ÔñÌá½»»ò·ÅÆú×Ô¼ºµÄ²Ù×÷¡£ÏÂÃæµÄÀý×ÓÑÝʾ´¦Àí³åÍ»¼ì²âµÄÒ»ÖÖ¿ÉÐз½·¨¡£Çë×¢Ò⣬DetailsViewµÄRowUpdatedʼþ²ÎÊý´«µÝÁË¿ÉÓÃÓÚ¼ì²âÓû§ÊäÈëµÄÖµµÄ×ֵ䡣Ä㻹¿ÉÒÔÉèÖÃÕâ¸öʼþ²ÎÊýµÄKeepInEditModeÊôÐÔ£¬Ê¹Óû§ÔÚ¾ö¶¨ÈçºÎ´¦Àí³åÍ»ÆÚ¼ä£¬DetailsView´¦Óڱ༭ģʽ¡£Õâ¸öÀý×ÓËùÊÔÑé·½·¨ÓëÉÏÃæÒ»¸öÀý×ÓÀàËÆ£¬Í¬Ê±´ò¿ªÁ½¸ö´°¿ÚÀ´´´½¨³åÍ»¸üС£

Protected Sub DetailsView1_ItemUpdated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdatedEventArgs)
¡¡If e.AffectedRows = 0 Then
¡¡¡¡' ʹDetailsView´¦Óڱ༭ģʽ²¢ÓëÊý¾Ý¿âͬ²½
¡¡¡¡e.KeepInEditMode = True
¡¡¡¡DetailsView1.DataBind()
¡¡
¡¡¡¡' ÓÃÓû§ÊäÈëµÄÖµÖØÐÂÌî³äDetailsView
¡¡¡¡Dim t As TextBox
¡¡¡¡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
¡¡End If
End Sub

Protected Sub DetailsView1_ModeChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewModeEventArgs)
¡¡If e.CancelingEdit = True AndAlso ErrorPanel.Visible = True Then
¡¡¡¡ErrorPanel.Visible = False
¡¡End If
End Sub

¡¡¡¡Ê¹ÓÃObjectDataSourceµÄʱºò£¬Çé¿öÒ²ÀàËÆ¡£Çë×¢Ò⣬ÓÉÓÚÊý¾ÝÔ´µÄConflictDetectionÊôÐÔ±»ÉèÖÃΪCompareAllValues£¬Êý¾ÝÔ´½«²éÕÒÒ»¸ö¿É½ÓÊÜContact¶ÔÏóµÄÿ¸ö×ֶεÄԭʼֵµÄUpdateContactÖØÔØ¡£

¡¡¡¡Ä㻹¿ÉÒÔͬʱʹÓÃDataObjectTypeNameÊôÐÔºÍCompareAllValues¡£ÔÚÕâÖÖÇé¿öÏ£¬ObjectDataSource²éÕÒ½ö½ÓÊÜÁ½¸ö²ÎÊý£¨¶¼ÊÇContact£©µÄUpdateContactÖØÔØ¡£µÚÒ»¸ö²ÎÊýÊÇ´æ·ÅÐÂÖµµÄContact¶ÔÏ󣬵ڶþ¸ö²ÎÊýÊÇ´æ·Å¾ÉÖµµÄContact¶ÔÏó¡£