Я делаю экран входа пользователя в С# winforms, я хочу иметь возможность проверять имя пользователя и пароль пользователя по записям в базе данных 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());
}
USER
- зарезервированное ключевое слово в T-SQL. Вы должны использовать его с квадратными скобками, например [USER]
. Однако лучшим решением является изменение имени на незарезервированное слово.
Всегда используйте параметризованные запросы. Этот тип конкатенаций строк открыт для атак SQL Injection.
USER
- псевдоним для столбца Username
. Вы должны использовать это оригинальное имя в своем WHERE
.
И using
инструкцию using
для размещения ваших 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())
{
...
}
}
Вы должны использовать квадратные скобки, если вы используете любое ключевое слово, которое предопределено ИЛИ зарезервировано Sql Server
например, здесь вы используете USER
вы должны использовать [USER]
а также ваш запрос неверен, вы должны использовать имя пользователя вместо пользователя в where clause
Вы должны использовать это
com.CommandText = ("SELECT (Username) AS [User], (Password) as Pass FROM dbname WHERE Username='" + textBox1.Text + "'");