Formview: проверяет, существует ли запись, когда пользователь пытается вставить данные ASP.NET C#

#c# #asp.net #formview

#c# #asp.net #formview

Вопрос:

Есть ли способ, которым я мог бы сгенерировать окно сообщения, если запись существует в базе данных после того, как пользователь нажал кнопку вставить ссылку? Я хочу, чтобы formview проверял, существует ли запись, если не выполнит вставку.

Помощь была бы высоко оценена. Заранее спасибо 🙂

Вот пример моего кода:

Управление книгами

Добавление / удаление книг

Примечание: Для получения идентификатора книги / ISBN, пожалуйста, обратитесь к штрих-коду в ISBN, обычно расположенному в конце книги. Требуется считыватель штрих-кода.

     <EditItemTemplate>

        Book ID/ISBN:
        <asp:Label ID="bookidLabel1" runat="server" Text='<%# Eval("bookid") %>' />
        <br />

        Title:
        <asp:TextBox ID="booktitleTextBox" runat="server" 
            Text='<%# Bind("booktitle") %>' />
        <br />

        Author's lastname:
        <asp:TextBox ID="lastnameTextBox" runat="server" 
            Text='<%# Bind("lastname") %>' />
        <br />

        Author's firstname:
        <asp:TextBox ID="firstnameTextBox" runat="server" 
            Text='<%# Bind("firstname") %>' />
        <br />

        Description:
        <asp:TextBox ID="descriptionTextBox" runat="server" 
            Text='<%# Bind("description") %>' />
        <br />

        Category:
        <asp:TextBox ID="categoryidTextBox" runat="server" 
            Text='<%# Bind("categoryid") %>' />
        <br />

        Date added:
        <asp:TextBox ID="dateaddedTextBox" runat="server" 
            Text='<%# Bind("dateadded") %>' />
        <br />

        Status:
        <asp:TextBox ID="statusidTextBox" runat="server" 
            Text='<%# Bind("statusid") %>' />
        <br />

        Quantity:
        <asp:TextBox ID="quantityTextBox" runat="server" 
            Text='<%# Bind("quantity") %>' />
        <br />

        name:
        <asp:TextBox ID="nameTextBox" runat="server" Text='<%# Bind("name") %>' />
        <br />
        <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" 
            CommandName="Update" Text="Update" />
        amp;nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" 
            CausesValidation="False" CommandName="Cancel" Text="Cancel" />

    </EditItemTemplate>

    <InsertItemTemplate>

        Book ID:
        <asp:TextBox ID="bookidTextBox" runat="server" Text='<%# Bind("bookid") %>' />
        <asp:RequiredFieldValidator ID="RequesFieldValidator1" runat="server" ErrorMessage="* Required" ControlToValidate="bookidTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <asp:RegularExpressionValidator ID="RegularExpressionValidator" runat="server" Display="Dynamic" ControlToValidate="bookidTextBox" ValidationExpression="^([Ss]{13,13})$" ErrorMessage="Invalid ID/ISBN. Please try again" ValidationGroup="InsertBook">
        </asp:RegularExpressionValidator>
        <br />

        Title:
        <asp:TextBox ID="booktitleTextBox" runat="server" 
            Text='<%# Bind("booktitle") %>' />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="* Required" ControlToValidate="booktitleTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <br />

        Author's lastname:
        <asp:TextBox ID="lastnameTextBox" runat="server" 
            Text='<%# Bind("lastname") %>' />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="* Required" ControlToValidate="lastnameTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <br />

        Author's firstname:
        <asp:TextBox ID="firstnameTextBox" runat="server" 
            Text='<%# Bind("firstname") %>' />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ErrorMessage="* Required" ControlToValidate="firstnameTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <br />

        Description:
        <asp:TextBox ID="descriptionTextBox" runat="server" 
            Text='<%# Bind("description") %>' />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server" ErrorMessage="* Required" ControlToValidate="descriptionTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <br />

        Category:
        <asp:DropDownList ID="DropDownList1" runat="server" 
            DataSourceID="categoryDataSource" DataTextField="name" 
            DataValueField="categoryid" SelectedValue='<%# Bind("categoryid", "{0}") %>'>
        </asp:DropDownList>

        <asp:SqlDataSource ID="categoryDataSource" runat="server" 
            ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>" 
            SelectCommand="SELECT [categoryid], [name] FROM [TblCategory]">
        </asp:SqlDataSource>
        <br />

        Date added:
        <asp:TextBox ID="dateaddedTextBox" runat="server" 
            Text='<%# Bind("dateadded") %>'/>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator6" runat="server" ErrorMessage="* Required" ControlToValidate="dateaddedTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <%--<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
        ControlToValidate="dateaddedTextBox" ErrorMessage="RegularExpressionValidator"
        ValidationExpression="(19|20)dd(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])">
        </asp:RegularExpressionValidator>--%>
        <br />

        Status:
        <asp:DropDownList ID="DropDownList2" runat="server" 
            DataSourceID="statusDataSource" DataTextField="statusname" 
            DataValueField="statusid" SelectedValue='<%# Bind("statusid", "{0}") %>'>
        </asp:DropDownList>

        <asp:SqlDataSource ID="statusDataSource" runat="server" 
            ConnectionString="<%$ ConnectionStrings:LibrarySystemConnectionString %>" 
            SelectCommand="SELECT [statusid], [statusname] FROM [BookStatus]">
        </asp:SqlDataSource>
        <br />

        Quantity:
        <asp:TextBox ID="quantityTextBox" runat="server" 
            Text='<%# Bind("quantity") %>' />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="server" ErrorMessage="* Required" ControlToValidate="quantityTextBox" ValidationGroup="InsertBook">
        </asp:RequiredFieldValidator>
        <br />

        <asp:Button ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Add" ValidationGroup="InsertBook"/>

        <asp:Button ID="InsertCancelButton" runat="server" 
            CausesValidation="False" CommandName="Cancel" Text="Cancel" />

    </InsertItemTemplate>

    <ItemTemplate>
        <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
            CommandName="New" Text="New" />
    </ItemTemplate>
    <EmptyDataTemplate>
        <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
            CommandName="New" Text="New" />
    </EmptyDataTemplate>
    <HeaderTemplate>
        Add a new book
    </HeaderTemplate>

</asp:FormView>
  

Ответ №1:

Вы можете проверить в методе ItemInserting.

Что-то вроде:

 void FormViewName_ItemInserting(object sender, FormViewInsertEventArgs e)
{
  string somevalue = e.Values["somefieldtoget"];
  //make your calls to the DB to check the somevalue doesn't exist 

  if(exists)
    e.Cancel = true; 
}
  

Вы также можете сделать это с помощью метода вставки источников данных (предполагается, что sql datasource)….

 void datasourcename_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
...
}
  

Другой подход, упомянутый @steve-wellens, заключается в том, что если у вас есть первичный ключ, основанный на одном или нескольких полях в представлении формы (не автоматически сгенерированный номер, тогда приведенный ниже отлично подойдет для обнаружения попытки вставить дубликат ключа / записи.

 void FormViewName_ItemInserted(object sender, FormViewInsertedEventArgs e)
{
  if (e.Exception != null)
  {
   if (((SqlException)e.Exception).Number == 2627)
   {
    e.ExceptionHandled = true;
    e.KeepInInsertMode = true;
    // Display error message.
   }
  }
}
  

Комментарии:

1. Сэр, могу я снова попросить вашего совета. Я понимаю логику, но все еще не смог реализовать ее в своей программе, поэтому в основном я хочу сгенерировать всплывающее сообщение на случай, если запись уже существует после того, как пользователь нажал «Вставить» («Добавить» в моем коде).

Ответ №2:

Было бы лучше поместить уникальный индекс в таблицу и перехватывать исключения, которые возникают при попытке вставить дублирующуюся запись.

Это самый простой способ обеспечить целостность. В противном случае вам придется запустить транзакцию чтения, чтобы обработать случай, когда между моментом проверки и моментом вставки какой-либо другой процесс выполняет точно такое же действие.