C# 无法使用ExecuteScalar查询SQL Server

C# 无法使用ExecuteScalar查询SQL Server,c#,asp.net,database,C#,Asp.net,Database,无法防止重复的电子邮件 我正在使用asp.net c#,并试图在用户输入重复电子邮件时显示消息(电子邮件已存在)。但它不起作用 这是我的密码: protected void Page_Load(object sender, EventArgs e) { if (IsPostBack) { SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionS

无法防止重复的电子邮件

我正在使用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();
    }

}

我注意到您的代码中有很多内容:

  • 页面加载(实际触发此调用的事件是什么,当前总是在页面加载时发生。)
  • 您没有使用参数,这使得您的代码容易受到SQL注入的影响
  • 将数据库对象直接转换为
    字符串
    (即:
    null
  • 响应通常会触发,但您在页面加载时这样做可能会使其不会触发
您可以做的一些事情是:

protected void Button1_Click(object sender, EventArgs e) { }
选择按钮后,将在
回发
上调用该事件。它应该调用
页面加载中的方法,而不是实际的功能

方法应如下所示:

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.
               }
           }
}
您可以调用
响应
,也可以使用
页面。RegisterClientScript
允许您调用Javascript警报;这可能比
响应更有益


希望这能为您指明一个坚实的方向。

我注意到您的代码中有很多地方:

  • 页面加载(实际触发此调用的事件是什么,当前总是在页面加载时发生。)
  • 您没有使用参数,这使得您的代码容易受到SQL注入的影响
  • 将数据库对象直接转换为
    字符串
    (即:
    null
  • 响应通常会触发,但您在页面加载时这样做可能会使其不会触发
您可以做的一些事情是:

protected void Button1_Click(object sender, EventArgs e) { }
选择按钮后,将在
回发
上调用该事件。它应该调用
页面加载中的方法,而不是实际的功能

方法应如下所示:

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.
               }
           }
}
您可以调用
响应
,也可以使用
页面。RegisterClientScript
允许您调用Javascript警报;这可能比
响应更有益


希望这能为您指明一个坚实的方向。

我注意到您的代码中有很多地方:

  • 页面加载(实际触发此调用的事件是什么,当前总是在页面加载时发生。)
  • 您没有使用参数,这使得您的代码容易受到SQL注入的影响
  • 将数据库对象直接转换为
    字符串
    (即:
    null
  • 响应通常会触发,但您在页面加载时这样做可能会使其不会触发
您可以做的一些事情是:

protected void Button1_Click(object sender, EventArgs e) { }
选择按钮后,将在
回发
上调用该事件。它应该调用
页面加载中的方法,而不是实际的功能

方法应如下所示:

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.
               }
           }
}
您可以调用
响应
,也可以使用
页面。RegisterClientScript
允许您调用Javascript警报;这可能比
响应更有益


希望这能为您指明一个坚实的方向。

我注意到您的代码中有很多地方:

  • 页面加载(实际触发此调用的事件是什么,当前总是在页面加载时发生。)
  • 您没有使用参数,这使得您的代码容易受到SQL注入的影响
  • 将数据库对象直接转换为
    字符串
    (即:
    null
  • 响应通常会触发,但您在页面加载时这样做可能会使其不会触发
您可以做的一些事情是:

protected void Button1_Click(object sender, EventArgs e) { }
选择按钮后,将在
回发
上调用该事件。它应该调用
页面加载中的方法,而不是实际的功能

方法应如下所示:

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.
               }
           }
}
您可以调用
响应
,也可以使用
页面。RegisterClientScript
允许您调用Javascript警报;这可能比
响应更有益


希望这为您指明了一个坚实的方向。

Equals
=
用于SQL中的精确匹配,这意味着如果您的字段是带有额外空格的varchar,或者您的文本框中的值包含空格,则字符串将不匹配

考虑使用:

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

Equals
=
用于SQL中的精确匹配,这意味着如果字段是带有额外空格的varchar,或者文本框中的值包含空格,则字符串将不匹配

考虑使用:

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

Equals
=
用于SQL中的精确匹配,这意味着如果字段是带有额外空格的varchar,或者文本框中的值包含空格,则字符串将不匹配

考虑使用:

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

Equals
=
用于SQL中的精确匹配,这意味着如果字段是带有额外空格的varchar,或者文本框中的值包含空格,则字符串将不匹配

考虑使用:

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

我本来想发表评论的,但是太长了

你检查你的html了吗?我不认为
Response.Write
会替换页面,这样您可能会在html标记之前看到它,而无法看到它。有什么东西可以结束这个回答吗

您不应该设置一个变量或标签来在页面上显示消息,而不是使用response.write吗

在数据库中插入的内容在哪里?它是否发生在类似于
按钮和u 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);

我本打算对此发表评论,但它是