c#
  • sql-server
  • 2009-06-16 8 views 1 likes 
    1

    Quelqu'un peut-il me dire ce qui ne va pas avec ma déclaration SQL et comment je peux l'améliorer?Aidez-moi à corriger cette instruction SQL?

    da = new SqlDataAdapter("SELECT * FROM Guests"+" WHERE Students.name='" + 
        byNametextBox.Text + "'", MyConn); 
    
    +0

    me semble bon – rball

    +2

    Je suppose que vous savez ce que l'injection sql est et cet échantillon est juste pour cette question? Sinon, faites une recherche sur ce débordement de pile. – PQW

    +1

    Injection SQL, quelqu'un? –

    Répondre

    0
    SqlDataAdapter("SELECT Guests.* FROM Guests,Students WHERE Guest.StudentId = Student.Id and Students.name='" + byNametextBox.Text + "'", MyConn);` 
    
    +0

    merci beaucoup pour vous –

    +0

    Qu'en est-il de l'injection SQL? –

    0

    Vous devez Inner Join. Je pense que ce serait quelque chose comme ceci:

    SELECT Guests.* FROM Guests INNER JOIN Students ON Students.name = Guests.name WHERE Students.name = '" + byNametextBox.Text + "'" 
    
    +0

    + 1 mis à jour pour la jointure interne. –

    +0

    Que se passe-t-il si mon nom est '; DROP TABLE Guests--? – LukeH

    +2

    Little Bobby Tables est ce qui se passe. http://xkcd.com/327/ –

    -1

    Essayez-le:

    "SELECT g.* 
    FROM Guests g 
    INNER JOIN Students s ON g.StudentId = s.StudentId 
    WHERE Students.Name = '" + byNametextBox.Text + '"' 
    

    En supposant que le wich domaine concerne les deux tables est StudentID.

    Attention, SQL n'est pas le même entre différents serveurs. Cette déclaration va fonctionner sur Sql Server, je ne sais pas dans d'autres. De plus, prenez garde de ne pas vous protéger des attaques par injection SQL. Vous devez effectuer votre requête avec des paramètres, au lieu de concaténer les chaînes comme vous le faites.

    Il s'agit d'une requête simple que vous devriez connaître par vous-même. Vous pouvez rechercher des didacticiels sur Google, mais here est une introduction générique.

    +0

    Pouvez-vous utiliser un SQLDataAdapter pour autre chose que SQL Server? – JeffO

    +0

    @Guiness: Les objets Sql * (y compris SqlDataAdapter) dans System.Data.SqlClient sont destinés uniquement à SQL Server. Des objets plus génériques de noms similaires existent dans les espaces de noms System.Data.OleDb et System.Data.Odbc (par exemple OleDbDataAdapter et OdbcDataAdapter) vous permettent d'utiliser la même fonctionnalité avec n'importe quelle base de données pour laquelle vous avez un fournisseur OLEDB ou un pilote ODBC. D'autres fournisseurs de bases de données peuvent fournir leurs propres assemblys offrant des fonctionnalités similaires. –

    +0

    Je ne lui montrerais pas un «mauvais» moyen de le faire. Montrer le bon chemin.Quelqu'un peut venir et utiliser votre code sans comprendre ce qu'est l'injection SQL. –

    4

    Un prédicat EXISTS est légèrement plus efficace qu'un JOIN si vous souhaitez uniquement des colonnes d'une des tables. De plus - ne jamais injecter des chaînes dans des instructions SQL comme ça - vous ne faites que mendier des attaques SQL Injection, ou des erreurs liées à des plantages (Oui, je sais que c'est une application Forms, mais c'est la même chose. "O'Leary", vous aurez un accident).

    SqlCommand cmd = new SqlCommand("SELECT * FROM Guests WHERE EXISTS (SELECT Id FROM Students WHERE Guests.StudentId = Students.Id And Students.name= @name)", MyConn); 
    cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = byNametextBox.Text; 
    SqlDataAdapter adapt = new SqlDataAdapter(cmd); 
    

    Note: Certaines personnes peuvent faire valoir que « SELECT * » est mauvais, et que vous devriez envisager de spécifier les noms de colonnes individuelles

    +0

    +1 pour l'utilisation des paramètres. –

    1

    Vous devez vous soucier de l'injection SQL. Dit simplement, l'injection SQL est quand un utilisateur est capable de mettre des instructions SQL arbitraires dans votre requête. Pour contourner ce problème, utilisez une procédure stockée ou une requête SQL paramétrée. Un exemple d'une requête SQL paramétrées est ci-dessous:

    SqlConnection conn = null; 
    SqlDataReader reader = null; 
    //Connection string goes here 
    
    string studentName = byNametextBox.Text; 
    
    SqlCommand cmd = new SqlCommand(
        "SELECT * FROM Guests "+" WHERE Students.name = @name", conn); 
    
    SqlParameter param = new SqlParameter("@name", SqlDbType.NVarChar, 50); 
    
    param.Value = studentName; 
    
    cmd.Parameters.Add(param); 
    reader = cmd.ExecuteReader(); 
    //Do stuff with reader here 
    
    +0

    +1 pour l'utilisation de la requête paramétrée! C'est ainsi que toutes les requêtes devraient être ... –

    Questions connexes