【问题标题】:Prevent multiple duplicate data entry into entities database(Closed)防止多个重复数据进入实体数据库(关闭)
【发布时间】:2017-02-06 07:31:09
【问题描述】:

我试图在插入数据库时​​防止重复数据输入到实体数据库中。目前这是我插入数据库的代码。我在网上查了很多帖子,但不确定要使用哪一个,因为它看起来真的很不一样。我正在尝试防止 PatientIc 重复输入并为其显示错误消息。提前致谢!

protected void myGridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
    //Insert new Prescription
    if (e.CommandName == "Insert")
    {
        Page.Validate("Add");
        if (Page.IsValid)
        {
            var fRow = myGridview.FooterRow;
            TextBox txtPatientName = (TextBox)fRow.FindControl("txtPatientName");
            TextBox txtPatientIC = (TextBox)fRow.FindControl("txtPatientIc");
            TextBox txtQuantity = (TextBox)fRow.FindControl("txtQuantity");
            DropDownList ddType = (DropDownList)fRow.FindControl("ddType");
            DropDownList ddState = (DropDownList)fRow.FindControl("ddState");
            using (CareGiverEntities dc = new CareGiverEntities())
            {
                dc.Contacts.Add(new Contact
                {
                    PatientName = txtPatientName.Text.Trim(),
                    PatientIc= txtPatientIC.Text.Trim(),
                    Quantity = txtQuantity.Text.Trim(),
                    MedicineTypeID = Convert.ToInt32(ddType.SelectedValue),
                    MedicineID = Convert.ToInt32(ddState.SelectedValue),
                    DatePrecribed= DateTime.Now
                });
                dc.SaveChanges();
                PopulateContacts();
            }
        }
    }
}

网格视图代码

<asp:GridView ID="myGridview" runat="server" AutoGenerateColumns="false"
    DataKeyNames="ContactID,MedicineTypeID,MedicineID" CellPadding="10" CellSpacing="0"
    ShowFooter="true" CssClass="myGrid"  HeaderStyle-CssClass="header" RowStyle-CssClass="trow1" 
    AlternatingRowStyle-CssClass="trow2" OnRowCommand="myGridview_RowCommand" OnRowCancelingEdit="myGridview_RowCancelingEdit" OnRowDeleting="myGridview_RowDeleting" OnRowEditing="myGridview_RowEditing" OnRowUpdating="myGridview_RowUpdating" AllowPaging="True" AllowSorting="True" >
    <EmptyDataTemplate>No results found.</EmptyDataTemplate> 
    <Columns>
        <asp:TemplateField SortExpression="FullName">
            <HeaderTemplate>Patient Name</HeaderTemplate>
            <ItemTemplate><%#Eval("PatientName") %></ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtPatientName" runat="server" Text='<%#Bind("PatientName") %>' />
                <asp:RequiredFieldValidator ID="rfCPEdit" runat="server" ForeColor="Red" ErrorMessage="*"
                    Display="Dynamic" ValidationGroup="edit" ControlToValidate="txtPatientName">Required</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="txtPatientName" runat="server"></asp:TextBox><br />
                <asp:RequiredFieldValidator ID="rfCP" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="Add" ControlToValidate="txtPatientName">Required</asp:RequiredFieldValidator>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>Patient IC</HeaderTemplate>
            <ItemTemplate><%#Eval("PatientIc") %></ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtPatientIc" runat="server" Text='<%#Bind("PatientIc") %>' />
                <asp:RequiredFieldValidator ID="rfCOEdit" runat="server" ForeColor="Red" ErrorMessage="*"
                    Display="Dynamic" ValidationGroup="edit" ControlToValidate="txtPatientIc">Required</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="txtPatientIc" runat="server"></asp:TextBox><br />
                <asp:RequiredFieldValidator ID="rfCO" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="Add" ControlToValidate="txtPatientIC">Required</asp:RequiredFieldValidator>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>Quantity</HeaderTemplate>
            <ItemTemplate><%#Eval("Quantity") %></ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtQuantity" runat="server" Text='<%#Bind("Quantity") %>' />
                <asp:RequiredFieldValidator ID="rfCNEdit" runat="server" ErrorMessage="*"
                    Display="Dynamic" ForeColor="Red" ValidationGroup="edit" ControlToValidate="txtQuantity">Required</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="txtQuantity" runat="server"></asp:TextBox><br />
                <asp:RequiredFieldValidator ID="rfCN" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="Add" ControlToValidate="txtQuantity">Required</asp:RequiredFieldValidator>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>Medicine Type</HeaderTemplate>
            <ItemTemplate><%#Eval("MedicineType") %></ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList ID="ddType" runat="server" AutoPostBack="true" 
                    OnSelectedIndexChanged="ddCountry_SelectedIndexChanged">
                    <asp:ListItem Text="Select Medicine type" Value="0"></asp:ListItem>
                </asp:DropDownList>
                <asp:RequiredFieldValidator ID="rfCEdit" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="edit" ControlToValidate="ddType" InitialValue="0">Required
                </asp:RequiredFieldValidator>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:DropDownList ID="ddType" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddCountry_SelectedIndexChanged">
                    <asp:ListItem Text="Select Medicine Type" Value="0"></asp:ListItem>
                </asp:DropDownList>
                <br />
                <asp:RequiredFieldValidator ID="rfC" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="Add" ControlToValidate="ddType" InitialValue="0">Required</asp:RequiredFieldValidator>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <HeaderTemplate>Medicine Name</HeaderTemplate>
            <ItemTemplate><%#Eval("MedicineName") %></ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList ID="ddState" runat="server">
                    <asp:ListItem Text="Select Medicine" Value="0"></asp:ListItem>
                </asp:DropDownList>
                <asp:RequiredFieldValidator ID="rfSEdit" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="edit" ControlToValidate="ddState" InitialValue="0">
                    Required
                </asp:RequiredFieldValidator>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:DropDownList ID="ddState" runat="server">
                    <asp:ListItem Text="Select Medicine" Value="0"></asp:ListItem>
                </asp:DropDownList><br />
                <asp:RequiredFieldValidator ID="rfS" runat="server" ErrorMessage="*"
                    ForeColor="Red" Display="Dynamic" ValidationGroup="Add" ControlToValidate="ddState"
                        InitialValue="0">Required</asp:RequiredFieldValidator>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lbEdit" runat="server" CommandName="Edit">Edit</asp:LinkButton>
                    &nbsp;|&nbsp;
                <asp:LinkButton ID="lbDelete" runat="server" CommandName="Delete" OnClientClick="return confirm('Are you confirm?')">Delete</asp:LinkButton>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:LinkButton ID="lbUpdate" runat="server" CommandName="Update" ValidationGroup="edit">Update</asp:LinkButton>
                    &nbsp;|&nbsp;
                <asp:LinkButton ID="lbCancel" runat="server" CommandName="Cancel">Cancel</asp:LinkButton>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:Button ID="btnInsert" runat="server" Text="Prescribe" CommandName="Insert" ValidationGroup="Add" />
            </FooterTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

【问题讨论】:

    标签: c# asp.net database


    【解决方案1】:

    在插入之前检查记录是否已经存在可能会解决您的重复问题。

    【讨论】:

    • 会试一试
    【解决方案2】:

    我猜您不想将 PatientIc 设置为主键,因此,我建议您在表架构本身中设置唯一约束。

    这样您就不必从数据库中检查是否存在冗余数据。

    【讨论】:

    • 呃,我真的不知道我应该怎么做。 ://
    【解决方案3】:

    您可以做的是在将 gridview 数据保存到数据库之前,您可以调用某些服务(一种返回 bool 值的方法)。该服务/方法将接受一个参数 (PatientIc) 并将检查相应的表是否存在任何记录。如果找到记录跳过插入,否则插入新的。

    bool IsPatientExists = IsPatientAlreadyExists(txtPatientIC);
    if (!IsPatientExists)
    {
        using (CareGiverEntities dc = new CareGiverEntities())
        {
            dc.Contacts.Add(new Contact
            {
                PatientName = txtPatientName.Text.Trim(),
                    PatientIc= txtPatientIC.Text.Trim(),
                    Quantity = txtQuantity.Text.Trim(),
                    MedicineTypeID = Convert.ToInt32(ddType.SelectedValue),
                    MedicineID = Convert.ToInt32(ddState.SelectedValue),
                    DatePrecribed= DateTime.Now
            });
            dc.SaveChanges();
            PopulateContacts();
        }
    } 
    
    private bool IsPatientAlreadyExists(string patientID)
    {
        using (CareGiverEntities dc = new CareGiverEntities())
        {            
            return dc.Contacts.Any(x=> x.PatientIc == patientID);
        }
    }
    

    【讨论】:

    • 嗨!感谢您的回复...但我对私有 bool IsPatientAlreadyExists 有疑问,因为它向我显示了“返回 ;”的许多语法错误声明
    • 是的,肯定会的,因为“”只是一个文本,它不是代码,您必须用一段调用 DB 的代码替换这部分和基于 patientlc 作为参数获取一些结果。为此,您可以使用 dc.Contacts.Any(x=&gt;x.PatientIc == patientID) 之类的东西。
    • 我的代码仍然有错误。 private bool IsPatientAlreadyExists(String patientId) { using (CareGiverEntities dc = new CareGiverEntities()) { dc.Contacts.Add(new Contact { return dc.Contacts.Any(x=> x.PatientIc==patientId); }); } 返回假; }
    • @Thibaut:我已经更新了我的答案。抱歉给您带来麻烦,忘记删除dc.Contacts.Add(new Contact { //... }); 部分。此外,您可以关闭您最近提出的新问题,因为它会吸引更多的反对者:)
    • 嗨,我在该行代码中收到此错误,但 System.Data.Entity.dll 中发生了“System.Data.EntityCommandExecutionException”类型的异常,但未在用户代码中处理
    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多