R.M49 Ответов: 1

Проверьте дублирование с базой данных ASP.NET с#


У меня есть подробное представление и кнопка, и я хочу, когда я нажимаю на кнопку, чтобы проверить, есть ли имя пользователя уже в базе данных или нет, я попробовал приведенный ниже код, но он переходит к оператору else, даже если имя пользователя существует.

Я хочу показать сообщение об ошибке вместо страницы ошибки, мой вопрос в том, куда я должен поместить свой код .. Кто-Нибудь Поможет??




<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" 

        CellPadding="4" DataKeyNames="Username" DataSourceID="SqlDataSource3" 

           ForeColor="#333333" GridLines="None" Height="50px" Width="283px" 

            style="margin-top: 0px; text-align: left;" 

           onitemupdated="DetailsView1_ItemUpdated" onitemdeleted="DetailsView1_ItemDeleted" 

           oniteminserted="DetailsView1_ItemInserted" DefaultMode="Insert" 

           oniteminserting="DetailsView1_ItemInserting">
        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" />
        <EditRowStyle BackColor="#999999" />
        <FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" />
        <Fields>
            <asp:TemplateField HeaderText="Username" SortExpression="Username">
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("Username") %>'></asp:Label>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Username") %>' 

                        ValidationGroup="1"></asp:TextBox>
                    <asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server" 

                        ErrorMessage="*" ControlToValidate="TextBox1" ForeColor="Red" 

                        ValidationGroup="1"></asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("Username") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Password" SortExpression="Password">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Password") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Password") %>' ValidationGroup="1"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" 

                        ControlToValidate="TextBox2" ErrorMessage="*" ForeColor="Red" 

                        ValidationGroup="1"></asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>

                </ItemTemplate>
                <ControlStyle />
            </asp:TemplateField>
            <asp:TemplateField HeaderText="UserType" SortExpression="UserType">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("UserType") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:DropDownList ID="DropDownList4" runat="server" 

                        ConnectionString ="<%$ConnectionStrings: ConnectionString %>" 

                        SelectedValue='<%# Bind("UserType") %>' ValidationGroup="1">
                    <asp:ListItem>--Select--</asp:ListItem>
                    <asp:ListItem>employee</asp:ListItem>
                    <asp:ListItem>doctor</asp:ListItem>
                    <asp:ListItem>student</asp:ListItem>
                    </asp:DropDownList> 
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" 

                        ControlToValidate="DropDownList4" ErrorMessage="*" ForeColor="Red" 

                        InitialValue="--Select--" ValidationGroup="1"></asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("UserType") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ButtonType="Button" ShowInsertButton="True" ValidationGroup="1" />
        </Fields>
        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
    </asp:DetailsView>


Что я уже пробовал:

protected void Button2_Click(object sender, EventArgs e)
     {
     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
     string query = "select Username from [Login]";
     SqlCommand cmd = new SqlCommand(query);
     SqlDataAdapter sqlda = new SqlDataAdapter(cmd.CommandText, con);
     DataTable dt = new DataTable();
     sqlda.Fill(dt);
     int RowCount = dt.Rows.Count;

     for (int i = 0; i < RowCount; i++)
     {
     Label13.Text = ((TextBox)DetailsView1.FindControl("TextBox1")).Text;
     Label14.Text = dt.Rows[i]["Username"].ToString();


     if (Label13.Text == Label14.Text)
     {
     string message = "Username is Already Exists";
     System.Text.StringBuilder sb = new System.Text.StringBuilder();
     sb.Append("<script type = 'text/javascript'>");
     sb.Append("window.onload=function(){");
     sb.Append("alert('");
     sb.Append(message);
     sb.Append("')};");
     sb.Append("</script>");
     ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", sb.ToString());

     }

     else
     {
     string message = "SuccessFully Saved";
     System.Text.StringBuilder sb = new System.Text.StringBuilder();
     sb.Append("<script type = 'text/javascript'>");
     sb.Append("window.onload=function(){");
     sb.Append("alert('");
     sb.Append(message);
     sb.Append("')};");
     sb.Append("</script>");
     ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", sb.ToString());


     }
     }
     }

[no name]

Отладчик, вероятно, может точно сказать вам, почему.

R.M49

как это исправить

[no name]

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

1 Ответов

Рейтинг:
1

Abhipal Singh

Я бы сказал, что код, которым вы поделились, довольно детский.. В любом случае, вот вопрос и предложение, чтобы сделать его лучше
Вопрос:

select Username from [Login]
Запрос вернет все имена пользователей из базы данных. Итак, вы повторяете весь результирующий набор. Предполагая, что имя пользователя будет встречаться только один раз в вашей таблице, условие if вернет true только один раз, а в остальное время оно будет попадать в else и, следовательно, проблема. Чтобы исправить это, выйдите из цикла, как только войдете в условие if. Это завершит цикл.

Я не мог понять цели этой петли, пока вы не заставите нас понять.

Предложение:
Отфильтруйте результирующий набор в вашем SQL-запросе, написав
select Username from [Login] WHERE Username = '<username from textbox>'
Это позволит вам проверить базу данных на наличие имени пользователя без повторения всего результирующего набора. Подумайте о сценарии, в котором у вас есть 10000 пользователей, и все они получают доступ к Вашей странице. Это заставит вас выполнить цикл 10000*10000 раз.


R.M49

Хорошо, я попробовал приведенный ниже код и протестировал его с помощью кнопки, и он работал, но знаю, что хочу назначить его команде insert detailsview. Я попытался поместить его в DetailsView1_ItemInserting, но в случае оператора if он дает мне желтую страницу ошибки с дублированием PK, но в случае оператора else работает нормально. Кто-Нибудь Поможет??

Скрыть   скопировать код

protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e)        {            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);            string query = "select Username from [Login] where Username = '" + ((TextBox)DetailsView1.FindControl("TextBox1")).Text + "'";            SqlCommand cmd = new SqlCommand(query, con);            con.Open();            SqlDataReader dr = cmd.ExecuteReader();                        dr.Read();            if (dr.HasRows == true)            {                 Response.Write("<script>alert('Username is Already Exists')</script>");             }            else            {                Response.Write("<script>alert('SuccessFully Saved')</script>");            }             con.Close();        }

Abhipal Singh

Конечно, это даст ошибку, если столбец username является PK (первичный ключ), предложение if будет истинным, если имя пользователя существует в базе данных, и вы попытаетесь вставить его снова, написав insert in if.

Опять же, чего вы пытаетесь достичь?

R.M49

утверждение if не содержит insertstatement, оно содержит сообщение об ошибке, которое я написал. Я хочу отобразить сообщение об ошибке, которое я поместил в Dr. hasraw statment, когда имя пользователя дублируется, я не хочу получать страницу ошибки из браузера, я хочу показать свое сообщение об ошибке. Что я хочу, так это показать окно сообщения, если имя пользователя существует.