我正在c#winforms中创建用户登录屏幕,我希望能够根据this link,检查用户的用户名和密码以防止SQL数据库中的记录,但我的代码会抛出一个异常,说“语法不正确靠近用户“。
有人能帮我弄清楚我的代码有什么问题吗?违规代码如下。
private bool CompareStrings(string string1, string string2)
{
return String.Compare(string1, string2, true, System.Globalization.CultureInfo.InvariantCulture) == 0 ? true : false;
}
private void LoginBtn_Click(object sender, EventArgs e)
{
//var username = textBox1.Text;
//var password = maskedTextBox1.Text;
try
{
SqlConnection Conn = new SqlConnection("Data Source=***********;Initial Catalog=*********;Persist Security Info=True;User ID=*********;Password=*******");
SqlCommand com = new SqlCommand();
com.Connection = Conn;
Conn.Open();
com.CommandText = ("SELECT (Username) AS User, (Password) as Pass FROM dbname WHERE User='" + textBox1.Text + "'");
SqlDataReader reader = com.ExecuteReader();
var username = textBox1.Text;
var password = maskedTextBox1.Text;
while (reader.Read())
{
if (this.CompareStrings(reader["User"].ToString(), username) &&
this.CompareStrings(reader["Pass"].ToString(), password))
{
MessageBox.Show("Login Authenticated!");
}
else
{
MessageBox.Show("Login failed!");
}
Conn.Close();
reader.Close();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
答案 0 :(得分:7)
USER
是T-SQL中的reserved keyword。您应该使用方括号(如[USER]
)。 但,最佳解决方案是将名称更改为非保留字。
始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。
USER
是Username
列的别名。您应该在WHERE
子句中使用它的原始名称。
并使用using
statement处理您的SqlConnection
和SqlCommand
以及SqlDataReader
。
using(SqlConnection Conn = new SqlConnection(connString))
using(SqlCommand com = Conn.CreateCommand())
{
com.CommandText = "SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username = @user";
com.Parameters.AddWithValue("@user", textBox1.Text);
Conn.Open();
using(SqlDataReader reader = com.ExecuteReader())
{
...
}
}
答案 1 :(得分:2)
如果您使用的是预定义或由Sql Server保留的任何关键字
,则必须使用方括号就像你在使用USER
一样,你应该使用 [USER]
以及您的查询错误您应使用用户名代替where clause
你应该使用这个
com.CommandText = ("SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username='" + textBox1.Text + "'");