2016-12-15 2 views
1

Ich schreibe ein C# Windows Forms-Programm. Als ich in dem Windows-Formular anmelden möchte, erhalte ich einen Fehler, der sagt:Über die eine nicht behandelte Ausnahme vom Typ 'System.Data.SqlClient.SqlException' in System.Data.dll aufgetreten

Eine erste Chance Ausnahme des Typs ‚System.Data.SqlClient.SqlException‘ in System.Data.dll

Weiteres aufgetreten Information: Ungültiger Objektname 'Login'.

Wenn für diese Ausnahme ein Handler vorhanden ist, kann das Programm sicher fortgesetzt werden.

Was soll ich tun? Vielen Dank.

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 WindowsFormsApplication1 
{ 
    public partial class LOGIN : Form 
    { 
     public LOGIN() 
     { 
      InitializeComponent(); 
     } 

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

     private void button1_Click(object sender, EventArgs e) 
     { 

      SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\kenlui\Documents\LoginDate.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"); 
      } 
     } 
    } 
} 
+0

Überprüfen Sie Ihre DB. Gibt es eine Login-Tabelle? – user3292642

+0

Sie haben die Verbindung nicht geöffnet? – Arti

+0

Fügen Sie einen eigenen Ausnahmehandler (try/catch) für die neue SQLConnection() -Anweisung hinzu. Wenn eine Ausnahme auftritt, führen Sie den Rest des Codes nicht aus. – jdweng

Antwort

2

Entweder dbo.Login Tabelle existiert nicht oder es wird mit einem anderen Schema zugeordnet. Wenn Sie Ihre Tabellen und Datenbankobjekte erstellen, sollten Sie ihnen dbo. voranstellen, wenn Sie nicht wissen, welche Schemas und wie sie zu verwenden sind.

Einige zusätzliche Fragen, die ich mit dem Code finden:

  • Sie sollten nie String-Verkettung verwenden, um eine SQL-Anweisung zu erstellen. Dies macht Ihren Code anfällig für SQL-Injection-Angriffe und auch für Syntaxfehler (wenn der Benutzername oder das Passwort beispielsweise ' enthalten). Verwenden Sie stattdessen parametrisierte SQL.
  • Speichern Sie Passwörter niemals im Klartext. Verwenden Sie eine Hashing-Bibliothek und erstellen Sie einen sicheren 1-Weg-Hash und bestehen Sie diesen Hash. Wenn Sie sich anmelden, erstellen Sie einen Hash aus dem angezeigten Passwort in der Benutzeroberfläche und vergleichen Sie diesen Wert mit dem Wert in der Datenbank.
  • Ihr Code schließt niemals die Datenbankverbindung. Um sicherzustellen, dass es immer geschlossen ist, nachdem Sie es abgeschlossen haben, wickeln Sie es in einen using Block, um sicherzustellen, dass es geschlossen und entsorgt wird, wird dies auch helfen, wenn eine Ausnahme ausgelöst wird.

Code mit einigen Korrekturen.

private void button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\kenlui\Documents\LoginDate.mdf;Integrated Security=True;Connect Timeout=30;")) 
    using (SqlDataAdapter sda = new SqlDataAdapter("Select Count(*) from Login where Username = @userName and Password = @password", con)) 
    using (DataTable dt = new DataTable()) 
    { 
     sda.SelectCommand.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar) { Value = textBox1.Text }); 
     // this should be a hash of the password, not the plain text value 
     sda.SelectCommand.Parameters.Add(new SqlParameter("@password", SqlDbType.VarChar) { Value = textBox2.Text }); 

     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"); 
     } 
    } 
} 

Schließlich stattdessen ein SqlDataAdapter betrachten verwenden stattdessen mit SqlCommand mit ExecuteScalar.

private void button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\kenlui\Documents\LoginDate.mdf;Integrated Security=True;Connect Timeout=30;")) 
    using (SqlCommand sda = new SqlCommand("Select 1 from Login where Username = @userName and Password = @password", con)) 
    { 
     sda.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar) { Value = textBox1.Text }); 
     // this should be a hash of the password, not the plain text value 
     sda.Parameters.Add(new SqlParameter("@password", SqlDbType.VarChar) { Value = textBox2.Text }); 
     var result = sda.ExecuteScalar(); 

     if (result != null && 1 == (int)result) 
     { 
      this.Hide(); 
      main ss = new main(); 
      ss.Show(); 
     } 
     else 
     { 
      MessageBox.Show("Please Check Username and Password"); 
     } 
    } 
} 
Verwandte Themen