Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码不防止数据库中的电子邮件地址重复_C#_Asp.net - Fatal编程技术网

C# 代码不防止数据库中的电子邮件地址重复

C# 代码不防止数据库中的电子邮件地址重复,c#,asp.net,C#,Asp.net,我的代码允许将重复的电子邮件添加到数据库中。在允许进入数据库之前,我添加了一行代码,以防止添加重复的电子邮件地址,但是使用此代码,我仍然会收到重复的电子邮件。我提供了asp.net中的表单代码和c#代码。请帮忙 最初我遇到了一个错误&我在VS中调试了代码&意识到我实际上有错误的电子邮件条目规范,已经纠正了。在VS调试器中,我看到TextBox1.Text和TextBox2.Text的值,我还看到通过字符串query的电子邮件地址=问题是,即使电子邮件已经在数据库中,它仍然会被再次添加。用我的代码

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

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

c#代码:

表格编号:

<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>

输入名称:

输入电子邮件:

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

原件:

var count = cmd.ExecuteNonQuery();
建议更改:

var count = cmd.ExecuteScalar();

该方法返回受插入、更新或删除影响的行数。如前所述,此方法用于执行DML(数据操作语言)语句


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

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


我建议向数据库添加一个唯一的约束,并在代码中捕获它。但是您可能更喜欢C#选项。@penmas,首先,查询倾向于sql注入可能重复的
var count = cmd.ExecuteScalar();
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!";
                    }
                }
            }
        }
    }
}