无法使用ExecuteScalar查询SQL Server

时间:2014-09-11 18:41:07

标签: c# asp.net database

无法阻止重复的电子邮件

我正在使用asp.net c#并在用户输入重复的电子邮件时尝试显示消息(电子邮件已存在)。但它没有用。

这是我的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        con.Open();
        string checkUser = "select count(*) from table where email='" + emailField.Text + "'";

        SqlCommand com = new SqlCommand(checkUser, con);
        int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
        if (temp == 1)
        {
            Response.Write("email already exist");

        }

        con.Close();
    }

}

4 个答案:

答案 0 :(得分:1)

等于=用于SQL中的完全匹配,这意味着如果您的字段是具有额外空格的varchar或文本框中的值具有它们,则字符串将不匹配。

考虑使用:

 "select count(*) from table where LTRIM(RTRIM(email))='" + emailField.Text.Trim() + "'";

答案 1 :(得分:1)

我打算将此作为评论,但这太长了......

你检查过你的HTML吗?我不认为Response.Write会替换页面,因此您可能会在html标记之前找到它而无法看到它。有什么可以结束回应吗?

您是否应该设置变量或标签以在页面上显示消息而不是使用response.write?

插入数据库的位置在哪里?在buttonAdd_Click()这样的事件中是否会发生这种情况?同样,Page_Load中的这段代码在该处理程序之前执行,但处理程序仍然被执行。

您应该使用命令参数来防止注入。如果有人输入此电子邮件地址会发生什么?

'; drop table [table];--

参数很简单,只需更改查询并添加参数:

string checkUser = "select count(*) from table where email=@email";
SqlCommand com = new SqlCommand(checkUser, con);
com.Parameters.AddWithValue("@email", emailField.Text);

答案 2 :(得分:1)

string checkUser = "select count(*) from table where email=@email";
SqlCommand command = new SqlCommand(checkUser, conn);
command.Parameters.AddWithValue("@email", emailField.Text);

答案 3 :(得分:0)

我注意到你的代码很多:

  • 页面加载(实际上触发此调用的事件是什么,目前它总是在页面加载时发生。)
  • 您没有使用参数,这使您的代码容易受到SQL注入。
  • 您将数据库对象直接转换为string(即:null
  • 响应通常会触发,但是您在Page Load处执行此操作会导致它无法触发。

你可以做的一些事情是:

protected void Button1_Click(object sender, EventArgs e) { }

选择按钮后,将在Postback上调用该事件。哪个应该调用应该在Page Load而不是实际功能的方法。

该方法应如下所示:

private void DuplicateEmail()
{
     if(string.IsNullOrEmpty(txtEmail))
         return;

     int row = 0;
     string query = @"SELECT * FROM [SomeTable] WHERE ([Email] = @Email);";

     using(SqlConnection connection = new SqlConnection(ConfigurationManager...))
          using(SqlCommand command = new SqlCommand(query, connection))
          {
               connection.Open();
               command.Parameters.AddWithValue("@Email", txtEmail.Text);
               row = (Int32)command.ExecuteScalar();

               if(row == 1)
               {
                   // Call alert.
               }
           }
}

您可以拨打Response,也可以使用Page.RegisterClientScript来调用Javascript警报;这可能比Response更有益。

希望这能指明你的方向。