2017-05-23 8 views
0

J'essaie de créer un programme simple avec une partie de connexion, avec une base de données locale juste pour tester. Et j'obtiens toujours une erreur lorsque j'essaie d'ouvrir la connexion à la base de données SQL .Formulaire de connexion, exception SQL

private void logInButton_Click(object sender, EventArgs e) 
    { 
     MainMenu openMainMenu = new MainMenu(); 
     SqlConnection sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C: \Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf;Integrated Security=True;Connect Timeout=30"); 
     sqlcon.Open(); 
     SqlCommand cmd = new SqlCommand("Select * from Table Where username ='" + usernameTextBox.Text + "' and password = '" + passwrodTextBox.Text + "'"); 
     SqlDataAdapter sda = new SqlDataAdapter(cmd); 
     DataTable dtbl = new DataTable(); 
     sda.Fill(dtbl); 
     if (dtbl.Rows.Count > 0) 
     { 
      openMainMenu.Show(); 
      this.Hide(); 
     } 
     else 
      MessageBox.Show("Wrong username or password!"); 
    } 

Je reçois l'erreur à sqlcon.Open() ;, et il est: « Une exception non gérée du type 'System.Data.SqlClient.SqlException' a eu lieu dans System.Data.dll

supplémentaires Information: Échec de la tentative de connexion d'une base de données nommée automatiquement pour le fichier C: \ Users \ Nea Florin \ Desktop \ PlatformaTestare \ PlatformaTestare \ Server.mdf Une base de données portant le même nom existe ou le fichier spécifié ne peut pas être ouvert. situé sur la part UNC. "

+0

Le nom de fichier, vous avez un espace entre 'C:' et '\ Users \ .... mdf' ... – t0mm13b

+1

Avant de faire quoi que ce soit d'autre , lire à propos de l'injection SQL et des requêtes paramétrées. Après cela, lisez à propos du hachage du mot de passe. –

+0

En outre, découvrez les exceptions et comment les gérer avec élégance. – t0mm13b

Répondre

1

Eh bien, le meilleur conseil que je peux vous donner est de google the error message. Gardez à l'esprit que s'il y a un message d'erreur, cela signifie que le problème est bien connu et que c'est un pari sûr que quelqu'un l'a rencontré avant vous et a réussi à le résoudre. Les 4 premiers résultats de cette recherche sont sur stackoverflow et au moins deux d'entre eux ont accepté des réponses, donc je crois qu'un peu de recherche vous aurait permis de gagner du temps.
Ceci est le meilleur conseil car il dépasse de loin votre problème actuel. Je crois fermement que de bonnes compétences de recherche sont les outils les plus importants et les plus puissants d'un développeur de logiciels. Je peux vous assurer, peu importe combien de temps vous développez un logiciel, presque toutes les exceptions que vous recevez, quelqu'un d'autre a déjà résolu et posté la solution quelque part, vous avez seulement besoin de le trouver.

Maintenant, comme pour le code en lui-même - Vous avez des problèmes majeurs autres que l'exception que vous demandez sur:

  1. Concaténation dans des instructions SQL au lieu d'utiliser les paramètres exposent votre code à SQL injection attaques. C'est une menace très sérieuse et extrêmement facile à réparer.
  2. L'utilisation d'insntances de classes qui implémente l'interface IDisposable sans les disposer correctement peut entraîner une fuite de mémoire. Lisez à propos de la déclaration using et prenez l'habitude de l'utiliser chaque fois que c'est possible.
  3. Gestion des exceptions. Actuellement, si votre base de données ne peut pas être atteinte, vous obtenez une exception et votre programme plante. Vous devriez utiliser un bloc try...catch partout où vous ne pouvez pas contrôler dans le code pour laisser votre programme se terminer gracieusement à la place. (N'utilisez jamais try ... catch pour les choses que vous pouvez faire dans le code comme valider l'entrée de l'utilisateur ou vérifier la division par zéro - seulement pour les choses qui sont sous votre contrôle comme la disponibilité de la base de données.)

dit, votre code devrait ressembler à ceci:

private void logInButton_Click(object sender, EventArgs e) 
{ 
    using (var sqlcon = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|C:\Users\Nea Florin\Desktop\PlatformaTestare\PlatformaTestare\Server.mdf;Integrated Security=True;Connect Timeout=30")) 
    { 
     sqlcon.Open(); 
     using (var cmd = new SqlCommand("Select 1 from Table Where username = @userName and password = @password")) 
     { 
      cmd.Parameters.Add("@userName", SqlDbType.NVarChar).Value = usernameTextBox.Text; 
      cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = passwrodTextBox.Text; 
      using (var dtbl = new DataTable()) 
      { 
       using (var sda = new SqlDataAdapter(cmd)) 
       { 
        sda.Fill(dtbl); 
       } 

       if (dtbl.Rows.Count > 0) 
       { 
        var openMainMenu = new MainMenu(); 
        openMainMenu.Show(); 
        this.Hide(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Wrong username or password!"); 
      } 
     } 
    }