只有在至少一个字段发生变化时才更新UpdateCommand?

时间:2013-08-12 13:41:10

标签: c# asp.net sql-server

是否可以在其中一个字段实际更改时触发UpdateCommand?其中一个字段是时间戳,我不希望更新时间戳,除非其中一个字段值实际发生了变化?

这是ASP前端,在CodeBehind中没有任何相关内容。不确定它是否重要,但我使用的是Infragistics WebDataGrid控件。

以下是这些内容,如果您需要更多内容,请告诉我们:

    <asp:SqlDataSource ID="tblClaimRoster" runat="server" 
        ConnectionString="<%$ ConnectionStrings:RosterConnectionString %>"
        ProviderName="System.Data.SqlClient" 
        SelectCommand="SELECT RosterID, [EE Name] AS EE_Name, [EEID], [Mgr Name] AS Mgr_Name, [Adjustment trained] AS Adjustment_trained, [Appeal trained] AS Appeal_trained, [ARGUS], [Auto Reversal] AS Auto_Reversal, [CBH D G] AS CBH_D_G, [CBH Proclaim] AS CBH_Proclaim, [CCE Tool Access] AS CCE_Tool_Access, [CCP], [CCR], [Checks Rework] AS Checks_Rework, [Chiro Occ Phys Home] AS Chiro_Occ_Phys_Home, [RA], [RDE], [Puerto Rico] AS Puerto_Rico, [Speech Vision Therapy] AS Speech_Vision_Therapy, [Stop Loss Calc] AS Stop_Loss_Calc, [Surg Anes] AS Surg_Anes, [Transplant], [Non Standard Contracts] AS Non_Standard_Contracts, [One View] AS One_View, [Pharmacy], [PMHS], [Post Pricing] AS Post_Pricing, [Pre D] AS Pre_D, [Proclaim], [Lifesource], [Maternity], [Medicare Hospital] AS Medicare_Hospital, [Medicaid], [Medicare Physician] AS Medicare_Physician, [MSP], [Negative Balance] AS Negative_Balance, [Foreign Claim] AS Foreign_Claim, [Hospital Standard] AS Hospital_Standard, [iCare], [ILWU], [iSave], [iView], [iTrack], [Correspondence trained] AS Correspondence_trained, [Defined Care] AS Defined_Care, [Dental Dentacom] AS Dental_Dentacom, [Dental Webster] AS Dental_Webster, [Dialysis], [ECPP], [Virgin Islands] AS Virgin_Islands, [Facets], [cFunds], [SAR], [Alliance], [MERPS], [Proclaim Green Screens] AS Proclaim_Green_Screens, [tblclaimRoster_Status], [Skill 1] AS Skill_1, [Skill 2] AS Skill_2, [Medicom], [CIGNA Claims] AS CIGNA_Claims, [Effective date in current role] AS Effective_date_in_current_role, [Time Stamp] AS Time_Stamp, [MSDRG], [ALI], [Call Trained] AS Call_Trained, [Dedicated Acct Taft Hartley] AS Dedicated_Acct_Taft_Hartley, [Dedicated Acct SOI] AS Dedicated_Acct_SOI, [SANP], [Dedicated Acct J J] AS Dedicated_Acct_J_J, [Xprtr], [VOB], [Hospital Non Standard] AS Hospital_Non_Standard FROM [tblclaimRoster] ORDER BY [EE Name] ASC"
        UpdateCommand="UPDATE [tblclaimRoster] SET [EE Name] = @EE_Name, [EEID] = @EEID, [Mgr Name] = @Mgr_Name, [Adjustment trained] = @Adjustment_trained, [Appeal trained] = @Appeal_trained, [ARGUS] = @ARGUS, [Auto Reversal] = @Auto_Reversal, [CBH D G] = @CBH_D_G, [CBH Proclaim] = @CBH_Proclaim, [CCE Tool Access] = @CCE_Tool_Access, [CCP] = @CCP, [CCR] = @CCR, [Checks Rework] = @Checks_Rework, [Chiro Occ Phys Home] = @Chiro_Occ_Phys_Home, [RA] = @RA, [RDE] = @RDE, [Puerto Rico] = @Puerto_Rico, [Speech Vision Therapy] = @Speech_Vision_Therapy, [Stop Loss Calc] = @Stop_Loss_Calc, [Surg Anes] = @Surg_Anes, [Transplant] = @Transplant, [Non Standard Contracts] = @Non_Standard_Contracts, [One View] = @One_View, [Pharmacy] = @Pharmacy, [PMHS] = @PMHS, [Post Pricing] = @Post_Pricing, [Pre D] = @Pre_D, [Proclaim] = @Proclaim, [Lifesource] = @Lifesource, [Maternity] = @Maternity, [Medicare Hospital] = @Medicare_Hospital, [Medicaid] = @Medicaid, [Medicare Physician] = @Medicare_Physician, [MSP] = @MSP, [Negative Balance] = @Negative_Balance, [Foreign Claim] = @Foreign_Claim, [Hospital Standard] = @Hospital_Standard, [iCare] = @iCare, [ILWU] = @ILWU, [iSave] = @iSave, [iView] = @iView, [iTrack] = @iTrack, [Correspondence trained] = @Correspondence_trained, [Defined Care] = @Defined_Care, [Dental Dentacom] = @Dental_Dentacom, [Dental Webster] = @Dental_Webster, [Dialysis] = @Dialysis, [ECPP] = @ECPP, [Virgin Islands] = @Virgin_Islands, [Facets] = @Facets, [cFunds] = @cFunds, [SAR] = @SAR, [Alliance] = @Alliance, [MERPS] = @MERPS, [Proclaim Green Screens] = @Proclaim_Green_Screens, [tblclaimRoster_Status] = @tblclaimRoster_Status, [Skill 1] = @Skill_1, [Skill 2] = @Skill_2, [Medicom] = @Medicom, [CIGNA Claims] = @CIGNA_Claims, [Effective date in current role] = @Effective_date_in_current_role, [Time Stamp] = GetDate(), [MSDRG] = @MSDRG, [ALI] = @ALI, [Call Trained] = @Call_Trained, [Dedicated Acct Taft Hartley] = @Dedicated_Acct_Taft_Hartley, [Dedicated Acct SOI] = @Dedicated_Acct_SOI, [SANP] = @SANP, [Dedicated Acct J J] = @Dedicated_Acct_J_J, [Xprtr] = @Xprtr, [VOB] = @VOB, [Hospital Non Standard] = @Hospital_Non_Standard WHERE [RosterID] = @RosterID">
    </asp:SqlDataSource>

对于超长字段列表感到抱歉,但TimeStamp字段接近结尾。

编辑:附有2张图像,显示阵列的顺序。 New Values New Values 2


Old Values Old Values 2

2 个答案:

答案 0 :(得分:1)

使用在即将完成更新之前调用的GridView OnRowUpdating事件。您可以检查您的值并取消更新操作。

在此OnRowUpdating事件处理程序中,您将GridViewUpdateEventArgs作为参数传递。这提供了两个属性:NewValues以获取新的/更新的值,OldValues来获取您将根据新值检查的旧值。 [注意使用e.NewValues&amp; e.OldValues]

您可以通过设置e.Cancel=true

取消更新操作

Refer MSDN

<asp:GridView ID="CustomersGrid" runat="server" AutoGenerateColumns="true" 
  AllowSorting="true"   OnRowUpdating="CustomersGrid_Updating"
  AutoGenerateEditButton="true" DataSourceID="SqlDataSourceCustomers">
</asp:GridView>

以下代码对我来说完全没问题

protected void CustomersGrid_Updating ( Object source, GridViewUpdateEventArgs e )
{

bool cancel = true;
object[] keysNewValues = (object[])Array.CreateInstance(typeof(object), e.NewValues.Count);
e.NewValues.Keys.CopyTo(keysNewValues, 0);

object[] keysOldValues = (object[])Array.CreateInstance(typeof(object), e.OldValues.Count);
e.OldValues.Keys.CopyTo(keysOldValues, 0);

 for (int i=0; i<keysNewValues.Count(); i++)
    {
     if ((e.NewValues[keysNewValues[i]] != null) && (e.OldValues[keysOldValues[i]] != null))
        { 

     if ( !(e.NewValues[keysNewValues[i]].ToString().Equals(e.OldValues[keysOldValues[i]])))
    // set cancel to false since you now have atleast one value which is changed
                        cancel = false;
        }
if ((e.NewValues[keysNewValues[i]] != null) && (e.OldValues[keysOldValues[i]] == null))
            {
                cancel = false;
            }
if ((e.NewValues[keysNewValues[i]] == null) && (e.OldValues[keysOldValues[i]] != null))
            {
                cancel = false;
            }
     }


     if (cancel)
      e.Cancel = true;

    }

确保,如果设置了一个Newvalue null,那么Column允许null为相同的else,它将引发异常。虽然它需要通过使用Try&amp; amp;抓住阻止。 如果任何值为null(旧值和新值),则null收集后的e.NewValues类型为:system.collections.specialized.ordereddictionary。还从下面的调试中检查过:

enter image description here

答案 1 :(得分:0)

我能想到的唯一方法是实际比较WHERE部分中的每个字段,时间戳字段除外

示例代码:

UPDATE [tblclaimRoster] 
SET [EE Name] = @EE_Name,
    [EEID] = @EEID,
    [Mgr Name] = @Mgr_Name,
    ...
WHERE
    [RosterID] = @RosterID AND
    ([EE Name] <> @EE_Name OR [Mgr Name] <> @Mgr_Name OR ...)