C# 无法使用ExecuteScalar查询SQL Server
无法防止重复的电子邮件 我正在使用asp.net c#,并试图在用户输入重复电子邮件时显示消息(电子邮件已存在)。但它不起作用 这是我的密码: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
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);
我本打算对此发表评论,但它是