.NET SqlDataReader:SqlException 未由用户代码处理
本文关键字:用户 代码 处理 SqlDataReader SqlException NET | 更新日期: 2023-09-27 18:33:08
使用创建的 SQL Server 表构建一个简单的 .NET Web 应用程序。 我不断收到有关SqlDataReader的错误,并且被困在出错的地方。
这是我的错误:其他信息:关键字"Table"附近的语法不正确。
这是我的代码:
编辑:
bool authenticated = AuthenticateMe(txtUsername.Text, txtPassword.Text);
if (authenticated)
{
Response.Redirect("Home.aspx");
}
else
{
Response.Redirect("Default.aspx");
}
}
private bool AuthenticateMe(string username, string password)
{
// string ErrorMessage = "";
string connectionString = @"Data Source=(LocalDB)'v11.0;AttachDbFilename=|DataDirectory|'Database1.mdf;Integrated Security=True;Connect Timeout=30";
string commandText = "SELECT Username from [Table] where Username = @name AND Password = @pwd";
// try
// {
using (SqlConnection sqlConnection1 = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
{
sqlConnection1.Open();
cmd.Parameters.AddWithValue("@name", username);
cmd.Parameters.AddWithValue("@pwd", password);
int result = (int)cmd.ExecuteNonQuery();
if (result > 0)
{
return true;
}
else
{
return false;
}
}
}
第一版(编辑前):
protected void bnLogin_Click(object sender, EventArgs e)
{
bool authenticated = AuthenticateMe(txtUsername.Text, txtPassword.Text);
if (authenticated)
{
Response.Redirect("Home.aspx");
}
else
{
Response.Redirect("Default.aspx");
}
}
private bool AuthenticateMe(string userName, string password)
{
string connectionString = @"Data Source=(LocalDB)'v11.0;AttachDbFilename=|DataDirectory|'Database1.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection sqlConnection1 = new SqlConnection(connectionString);
sqlConnection1.Open();
SqlCommand cmd = new SqlCommand("SELECT Username from Table where Username = userName");
cmd.Connection = sqlConnection1;
SqlDataReader reader = cmd.ExecuteReader();
Response.Write("Entered Sucessfully");
reader = cmd.ExecuteReader();
string localUserName = (string)reader["Username"];
sqlConnection1.Close();
if (userName.Equals(localUserName))
{
return true;
}
else
{
return false;
}
Table 是 SQL 中的保留关键字。 尝试在其周围加上方括号:
SqlCommand cmd = new SqlCommand("SELECT Username from [Table] where Username = userName");
表是一个关键字。如果你的表被调用 Table
,你的 sql 必须转义它。试试[Table]
.
另请注意,您需要为用户名使用参数 - 即 where Username = @userName
,您还可以将具有该名称的参数添加到具有适当值的命令中。
您的 AuthenticateMe 方法似乎有点错误且无法对用户进行身份验证
- 使用保留关键字 (表) 而不使用正确的分隔符(方括号)
- 您不会将用户名和密码传递给检查的查询如果用户在场
- 您调用两次 ExecuteReader (?)
- 使用与使用的相同值检查查询中的返回值用于搜索(无用)
所以你可以用这种方式重写代码
private bool AuthenticateMe(string userName, string password)
{
string connectionString = @".....";
string commandText = "SELECT COUNT(*) from [Table] where Username = @name AND Pass = @pwd");
using(SqlConnection sqlConnection1 = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandText, sqlConnection1))
{
sqlConnection1.Open();
cmd.Parameters.AddWithValue("@name", username);
cmd.Parameters.AddWithValue("@pwd", password);
int result = Convert.ToInt32(cmd.ExecuteScalar());
return (result > 0);
}
}
另外,请记住,以纯文本形式将密码存储在数据库中被认为是一种不好的做法。应该对记忆的密码应用某种哈希函数,以便在有人获得数据库副本时禁止任何安全问题。
我认为您的SQL查询存在2个问题。
"从用户名 = 用户名的表中选择用户名"
- 表是一个保留关键字。为表或 [表] 使用其他名称。
-
最后一部分,用户名=用户名,也是错误的。如果你打算在那里有一个常量字符串,你应该考虑把用户名放在引号中'''用户名'''。不要忘记转义符号。如果要将参数传递给 SQLCommand,请在查询中使用@username并以这种方式传递值
cmd.Parameters["@username"].值 = "鲍勃";