【问题标题】:Code Not Preventing Duplicate E-mail Addresses in Database代码不能防止数据库中的重复电子邮件地址
【发布时间】:2016-10-27 03:56:41
【问题描述】:

我的代码允许将重复的电子邮件添加到数据库中。我在允许进入数据库之前添加了一行代码,以防止添加重复的电子邮件地址,但是使用此代码我仍然会收到重复的电子邮件。我已经在 asp.net 和 c# 代码中提供了表单代码。请帮忙。

最初我遇到了一个错误,我在 VS 中调试了代码,并意识到我实际上有错误的电子邮件条目规范,已更正。在 VS 调试器中,我看到了 TextBox1.Text 和 TextBox2.Text 的值,我还看到了通过字符串查询传递的电子邮件地址 = 但是问题是即使电子邮件已经在数据库中,它仍然会得到再次添加。有什么改进可以用我的代码解决这个问题吗?是不是我的逻辑错了?

c#代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection();
        con.ConnectionString = ConfigurationManager.ConnectionStrings["northwind"].ToString();
        con.Open();
        string query = "SELECT COUNT(ID) FROM Table1 WHERE pEmail= '" + TextBox2.Text +"'";
        OleDbCommand cmd = new OleDbCommand(query, con);

        var count = cmd.ExecuteNonQuery();

        if (count > 0)
        {
            Label1.Text = "email is already in use";
        }
        else {
        cmd.CommandText = "insert into[Table1](pName, pEmail)values(@nm,@em)";
        cmd.Parameters.AddWithValue("@nm", TextBox1.Text);
        cmd.Parameters.AddWithValue("@em", TextBox2.Text);
        cmd.Connection = con;
        int a = cmd.ExecuteNonQuery();
        if (a>0)
            {
                Label1.Text = "Inserted Sucessfully!";
            }
        }
    }
}

表格代码:

<form id="form1" runat="server">
<div style="height: 138px">

    Enter Name:<asp:TextBox ID="TextBox1" runat="server" style="margin-left: 12px"></asp:TextBox>

    <asp:RequiredFieldValidator 
    id="reqName" 
    ControlToValidate="TextBox1"
    Style="color:Red"   
    ErrorMessage="Please enter your name!"
    runat="server"  />

    <br />
    Enter Email:&nbsp;&nbsp;&nbsp;
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

    <asp:RegularExpressionValidator 
    id="ValidEmail" 
    ControlToValidate="TextBox2" 
    Style="color:Red"
    ValidationExpression="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
    ErrorMessage="Invalid Email Entry" 
    runat="server" />

    <br />
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" />
    <br />
    <asp:Label ID="Label1" runat="server"></asp:Label>

</div>
</form>

【问题讨论】:

标签: c# asp.net


【解决方案1】:

您应该使用ExecuteScalar 而不是ExecuteNonQuery 来获取行数

原文:

var count = cmd.ExecuteNonQuery();

建议更改:

var count = cmd.ExecuteScalar();

参考https://stackoverflow.com/a/4269651/1050927

ExecuteNonQuery 方法返回受 INSERT、UPDATE 或 DELETE 影响的行数。此方法用于执行前面所述的 DML(数据操作语言)语句。

ExecuteScalar 方法将在 SELECT 语句的第一行第一列中返回单个值。当您希望查询中只返回一个值时,可以使用此方法。

【讨论】:

    【解决方案2】:

    使用ExecuteScalar 并将结果转换为int。我还建议您将 sql 查询连接更改为参数,如果您使用的是 ASP.NET 验证器,则必须检查页面的属性IsValid,因为它会告诉您控件是否已通过验证(请记住,用户可以禁用 javascript 并发布表单)。

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (IsValid)
        {
            using (var con = new OleDbConnection())
            {
                con.ConnectionString = ConfigurationManager.ConnectionStrings["northwind"].ToString();
                con.Open();
                using (var cmd = con.CreateCommand())
                {
                    cmd.CommandText = "SELECT COUNT(ID) FROM Table1 WHERE pEmail= @em";
                    cmd.Parameters.AddWithValue("@em", TextBox2.Text);
                    int count = Convert.ToInt32(cmd.ExecutScalar());
                    if (count > 0)
                    {
                        Label1.Text = "email is already in use";
                    }
                    else
                    {
                        cmd.CommandText = "insert into[Table1](pName, pEmail)values(@nm, @em)";
                        cmd.Parameters.AddWithValue("@nm", TextBox1.Text);
                        // not need to add @em parameter, it was added previously
                        int insertedRows = cmd.ExecuteNonQuery();
                        if (insertedRows > 0)
                        {
                            Label1.Text = "Inserted Sucessfully!";
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2023-03-23
      • 2021-08-29
      • 2015-10-06
      相关资源
      最近更新 更多