避免在数据库中插入任何空白行

避免在数据库中插入任何空白行

问题描述:

我已经发布了一个线程,避免向数据库中添加空行。之前当点击添加行时,无论用户是否取消新行,它都会自动向数据库中添加一个空行。我想通了,但现在出现了一个新问题。如果用户在编辑新行时决定重新加载页面(F5),它将在数据库中添加一个空白行,这对我的情况来说是一个不行。任何人都可以帮我弄清楚如何避免这种情况?避免在数据库中插入任何空白行

下面是我的插入代码:

protected void gv_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 

     if (e.CommandName == "Insert") //- this is needed to explain that the INSERT command will only work when INSERT is clicked 
     { 
      gv.DataBind(); 

      DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString"); 

      string transCode = "", fundCode = "", BSA_CD = "", DP_TYPE = ""; 

      if (d.Rows.Count > 0) 
      { 
       transCode = d.Rows[0]["TRANS_CD"].ToString(); 
       fundCode = d.Rows[0]["FUND_CD"].ToString(); 
       BSA_CD = d.Rows[0]["BSA_CD"].ToString(); 
       DP_TYPE = d.Rows[0]["DP_TYPE"].ToString(); 

       if (transCode.Trim().Length > 0) 
       { 
        dbcon.Execute("INSERT INTO CIS.CIS_TRANS (ID,TRANS_CD) VALUES(CIS.S_CIS_TRANS.nextval,'')", "ProjectCISConnectionString"); 

        gv.DataBind(); 
       } 
      } 

      gv.EditIndex = gv.Rows.Count - 1; 

     } 
     else if (e.CommandName == "Cancel") 
     { 
      DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString"); 

      string transCode = ""; 

      if (d.Rows.Count > 0) 
      { 
       transCode = d.Rows[0]["TRANS_CD"].ToString(); 

       if (transCode.Trim().Length == 0) 
       { 
        dbcon.Execute(string.Format("DELETE CIS.CIS_TRANS WHERE ID = '{0}'", d.Rows[0]["ID"]), "ProjectCISConnectionString"); 

        gv.DataBind(); 
       } 
      } 


     } 
    } 
+0

当你说“当用户试图在编辑时重新加载页面”是否意味着当用户在编辑表单时点击F5 ..? – MethodMan 2012-08-08 15:17:05

+0

是或当他们只选择网址并点击输入。 – KKP 2012-08-08 15:20:25

+0

为什么你在开始时调用'gv.DataBind();'? – 2012-08-08 15:21:48

如果你想避免用户插入空行,你需要验证。添加RequiredFieldValidator到插入模板:

<asp:RequiredFieldValidator runat="server" ID="valFieldName" 
< ControlToValidate="txtFieldName" ErrorMessage="FieldName is missing" /> 

在如果Page.IsValid == true你的方法检查你插入到数据库之前。

编辑: 如果你想避免回传完全,你可以插入整个网格为UpdatePanel

<asp:UpdatePanel> 
    <ContentTemplate> 
     <asp:GrdiView> 
     .... 
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

现在,当用户点击F5他只是再一次,而不是重新加载页面回发插入命令。

+0

好的,现在不适合这个镜头。 – KKP 2012-08-08 15:25:10

+0

在这种情况下验证器是否有必要?因为我已经在每个文本框上重新验证过验证器。我的情况是避免插入一个空白行,如果它的rreloaded(F5)(每隔一个停止空白行的方式被照顾)。 – KKP 2012-08-08 16:41:25

+0

F5是什么意思?是用户插入一行然后按F5? – 2012-08-08 19:10:27

看起来像你试图把太多的逻辑放入代码的一部分。您将数据库逻辑放入按钮命令中。想象一下,用户只需扫描此按钮。这会导致大量的空行。

尝试这种方法:划分数据库逻辑和UI逻辑(例如MVVM)。今天这是一种常见模式。

想象一下,你创建的所有对象,现在用户点击“保存”按钮(也可以通过改变连续发生 - 不管)。在执行保存命令后,你的视图模型(视图背后的逻辑)可以例如验证您的数据。所以你可以更容易地扩展你的用户界面的功能(如说:验证或类似的东西)。

如果您想与您现有的代码要做到这一点,每一个扩张会越来越炸毁它 - 直等到维护这个代码是可怕的它并没有花太多时间。

在你的虚拟机happend一切(验证等)的交易指令到你的数据库可能发生之后(类似myEntities.Save())。这个方法提供了你的业务对象被正确转换成SQL并存储在数据库中。

这只是MVVM模式的一个非常简短的解释,但这似乎是我唯一适当的解决方案。