2014-11-06 4 views
-3

Я посмотрел на форум и попробовал все, что предложили люди, и я не могу найти решение, которое сделает это решение. Программа будет работать до тех пор, пока она не будет подключена к базе данных. Тогда в этой точке он появится следующее сообщение об ошибке:SQL Exception был необработанным: Неверный синтаксис рядом с «Пользователь»

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: Incorrect syntax near 'user'.

User быть имя пользователя в моей странице входа.

Вот код, который у меня есть. Может ли кто-нибудь увидеть какие-либо проблемы, которые мне не хватает?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace LoginForm 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 

     SqlConnection con = new SqlConnection(@"Data Source=  (LocalDB)\v11.0;AttachDbFilename=C:\Users\Username\Documents\Data.mdf;Integrated Security=True;Connect  Timeout=30"); 
     SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From Login where Username'"  +textBox1.Text + "' and Password ='"+textBox2.Text+"'",con); 
     DataTable dt = new DataTable(); 
     sda.Fill(dt); 
     if(dt.Rows[0][0].ToString() == "1") 
     { 
      this.Hide(); 
      Main ss = new Main(); 
      ss.Show(); 
     } 
     else 
     { 
      MessageBox.Show("please check Username and Password and try again."); 
     } 
    } 
} 
+3

В этом ваша проблема: 'где U sername '"' = отсутствует знак равенства: 'где Username ='" ' –

+5

И _please_ научиться использовать параметры вместо конкатенации SQL - ESPECIALLY при доступе к информации о пользователе/​​пароле. –

+0

Я вижу синтаксическую ошибку (отсутствует знак равенства). Когда вы его исправили, попробуйте войти в систему как «dan», DELETE FROM Login; - », затем google для SQL-инъекции. – Joe

ответ

1

Лучшее использование real SqlParameter. Но сначала это должно помочь:

SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) From Login where Username ='"  +textBox1.Text + "' and Password ='"+textBox2.Text+"'",con); 

Но программа очень небезопасно, потому что вы можете получить sql-injection проблемы.

Посмотрите на это для SqlAdapter и SqlParameter: Getting SqlDataAdapter and SqlCommand confused

0

Один, как указано другими этот код является предметом SQL-инъекции

Вам не нужно DataTable, чтобы получить одно значение

SqlConnection con = new SqlConnection(@"Data Source (LocalDB)\v11.0;AttachDbFilename=C:\Users\Spyer\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30"); 
SqlCommand cmd = con.CreateCommand(); 
cmd.CommandText = "Select Count(*) From Login where Username = '" + textBox1.Text + "' and Password = '" + textBox2.Text + "'"; 
con.Open(); 
Int32 ccount = (Int32)cmd.ExecuteScalar(); 
con.Close(); 

Это правильный подход

String connString = @"Data Source (LocalDB)\v11.0;AttachDbFilename=C:\Users\Spyer\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30"); 
String sql = "Select Count(*) From Login where Username = @Name and Password = @Password"; 
Int32 ccount; 
using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    cmd.Parameters.Add("@Name", SqlDbType.VarChar); 
    cmd.Parameters["@Name"].Value = textBox1.Text; 
    cmd.Parameters.Add("@Password", SqlDbType.VarChar); 
    cmd.Parameters["@Password"].Value = textBox2.Text; 
    try 
    { 
     conn.Open(); 
     ccount = (Int32)cmd.ExecuteScalar(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
}