2010-12-05 6 views
0

Je me suis assuré que tout se rapporte aux types de colonnes dans la base de données, mais je continue à obtenir une exception SQLCeException. Quelqu'un peut-il me dire ce qui ne va pas avec ce code?insertion dans la base de données

private void ANDPaddDriverButton_Click(object sender, EventArgs e) 
{ 
    string first = ANDPfirstNametextBox.Text; 
    string last = ANDPlastNametextBox.Text; 
    string mid = textBox5.Text; 
    string phone = ANDPphonetextBox.Text; 
    string social = ANDPsSNtextBox.Text; 
     // EmployeeType="Employee" 
    string city = ANDPCityTextbox.Text; 
    string state = ANDPStatetextBox.Text; 
    string zip = ANDPzipCodetextbox.Text; 
    string email = ANDPemailtextBox.Text; 
    string address = ANDPaddressTextBox.Text; 
    string user = userName.Text; 

    DBConn.Open(); 
    SqlCeCommand cmd = new SqlCeCommand("INSERT INTO [Employee Table] VALUES (" + 
      first + "," + last + "," + mid + "," + address + "," + phone + "," + social + "," 
       + "Employee" + "," + city + "," + state + "," + zip + "," + email + "," + userName + ")", DBConn); 
    cmd.ExecuteNonQuery(); 
    DBConn.Close(); 
} 
+4

Il a un trou d'injection SQL, et un nom de pauvre table. – SLaks

Répondre

2

Vos champs de type chaîne/varchar doivent être placés entre guillemets simples!

SqlCeCommand cmd = new SqlCeCommand("INSERT INTO [Employee Table] VALUES (" + 
    "'" + first + "'," 

et ainsi de suite ...

De plus, comme quelqu'un a déjà commenté que vous allez exposer grandement votre code à des attaques par injection SQL

+7

** Non. ** Il devrait utiliser des paramètres. – SLaks

+3

Oui. Il devrait. Mais ce n'est pas la question. Il voulait juste savoir où est l'erreur – Lorenzo

+2

Je pense que toujours répondre à la question n'est pas nécessairement la meilleure politique. S'il a un trou de sécurité évident et que la réponse à la question ne répond pas à ce trou, le trou de sécurité se perpétue et met tout le monde en danger. Que faire si le PO prend la réponse et l'applique ensuite au code traitant des données de carte de crédit. Il y a un joli vecteur d'attaque facile là-bas! –

0

Comme l'a dit Lorenzo, les valeurs de chaîne doivent être entouré de guillemets simples, mais s'il vous plaît lire this page qui explique pourquoi vous ne devriez pas construire une requête de cette façon, et vous montre comment le faire avec des paramètres.

3

Utilisez les paramètres pour éviter l'injection SQL, et les noms de colonnes, parce que vous dépendez de la quantité, et l'ordre des colonnes de votre table et il changera probablement à l'avenir (je devine les noms de colonnes):

SqlCeCommand cmd = new SqlCeCommand("INSERT INTO [Employee Table] (First, Last, Mid, Address, Phone, Social, Employee, City, State, Zip, Email, UserName) VALUES (@First, @Last, @Mid, @Address, @Phone, @Social, @Employee, @City, @State, @Zip, @Email, @UserName)", DBConn); 
cmd.Parameters.AddWithValue("@First", first); 
cmd.Parameters.AddWithValue("@Last", last); 
cmd.Parameters.AddWithValue("@Mid", mid); 
cmd.Parameters.AddWithValue("@Address", address); 
cmd.Parameters.AddWithValue("@Phone", phone); 
// etc. each column 

Par ailleurs essayer de ne pas utiliser des espaces dans la table et les colonnes des noms ;-)

Questions connexes