【问题标题】:Avoid inserting any blank rows in a database避免在数据库中插入任何空白行
【发布时间】:2012-08-08 15:10:58
【问题描述】:

不久前我发布了一个关于避免在数据库中添加空白行的帖子。在单击添加行之前,无论用户是否取消了新行,它都会自动将空白行添加到数据库中。我想通了,但现在遇到了一个新问题。如果用户决定在编辑新行时重新加载页面(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();
                }
            }


        }
    }

【问题讨论】:

  • 当您说“当用户在编辑时尝试重新加载页面时”是指当用户在编辑表单时按 F5 时......?
  • 是的,或者当他们只是选择网址并点击进入时。
  • 为什么一开始就打电话给gv.DataBind();
  • 这实际上是一个错误的输入。由于我一直在更改我的代码来解决我的第一个问题,即在点击时添加一个空白行(不想要这个,只想在所有信息都填满后添加一行),我把它放在我的应用程序中。

标签: c# asp.net database visual-studio-2010


【解决方案1】:

如果您想避免用户插入空白行,您需要验证器。在插入模板中添加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 时,他只是重新加载页面,而不是发回插入命令。

【讨论】:

  • 在这种情况下是否需要验证器?因为我已经在每个文本框上都有 requriedfielvalidators。我的情况是避免插入一个空白行,如果它重新加载(F5)(处理所有其他停止空白行的方法)。
  • 你说的F5是什么意思?是用户插入一行然后按 F5 吗?
  • 我只是澄清 F%,因为它给其他用户造成了困惑。 F5 重新加载页面,如果有人在编辑表单中添加新行并且他们决定重新加载页面,它会加载回来并在数据库中插入一个空白行。我试图避免这种情况。
  • 您可以在UpdatePanel中插入网格
  • 能否请您提供更深入的解释。
【解决方案2】:

您似乎试图在代码的一部分中引入过多的逻辑。您将数据库逻辑放入按钮命令中。想象一下用户只是向这个按钮发送垃圾邮件。这会导致大量的空行。

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

想象一下,您创建了所有对象,现在用户点击了“保存”按钮(这也可能通过更改行来实现 - 无论如何)。执行保存命令后,您的视图模型(视图背后的逻辑)可以例如验证您的数据。因此,您可以更轻松地扩展 UI 上的功能(如验证或类似内容)。

如果你想用你当前的代码来做这件事,每次扩展都会把它炸得越来越厉害——而且维护这段代码不需要太多时间。

在您的虚拟机中的所有事情都发生(验证等)之后,进入您的数据库的事务命令可能会发生(类似于 myEntities.Save())。而且这种方法可以让您的业务对象正确地转换为 SQL 并存储在您的数据库中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2022-01-12
    • 1970-01-01
    • 2016-03-22
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多