2010-04-20 30 views
2

J'ai une table qui a trois champs, à savoir LM_code, M_Name, Desc. LC_code est un Id de chaîne générée automatiquement, en gardant ceci je mets à jour M_Name et Desc. J'ai utilisé la commande de mise à jour normale, la valeur passe en exécution mais les champs ne sont pas mis à jour. J'espère que l'utilisation des paramètres oledb les champs peuvent être mis à jour.comment mettre à jour une table en utilisant les paramètres oledb?

Voici mon code.

public void Modify() 
{ 
    String query = "Update Master_Accounts set (M_Name='" + M_Name + "',Desc='" + Desc + "') where LM_code='" + LM_code + "'"; 
    DataManager.RunExecuteNonQuery(ConnectionString.Constr, query); 
} 

Dans DataManager Class, j'exécute la chaîne de requête.

public static void RunExecuteNonQuery(string Constr, string query) 
{ 

    OleDbConnection myConnection = new OleDbConnection(Constr); 
    try 
    { 
     myConnection.Open(); 
     OleDbCommand myCommand = new OleDbCommand(query, myConnection); 
     myCommand.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     string Message = ex.Message; 
     throw ex; 
    } 

    finally 
    { 
     if (myConnection.State == ConnectionState.Open) 
      myConnection.Close(); 
    } 

} 

private void toolstModify_Click_1(object sender, EventArgs e) 
{ 
    txtamcode.Enabled = true; 
    jewellery.LM_code = txtamcode.Text; 
    jewellery.M_Name = txtaccname.Text; 
    jewellery.Desc = txtdesc.Text; 
    jewellery.Modify(); 
    MessageBox.Show("Data Updated Succesfully"); 

} 

Répondre

5

Vous êtes près avec le reste de votre connexion et tel, mais comme vous le constatez, le faire avec des requêtes paramétrées est plus sûr de SQL Injection ...

// Some engines used named parameters, others may not... The "?" 
    // are "place-holders" for the ordinal position of parameters being added... 
    String MyQuery = "Update MyTable set SomeField = ?, AnotherField = ? " 
     + " where YourKeyField = ?"; 

    OleDbCommand MyUpdate = new OleDbCommand(MyQuery, YourConnection); 

    // Now, add the parameters in the same order as the "place-holders" are in above command 
    OleDbParameter NewParm = new OleDbParameter("ParmForSomeField", NewValueForSomeField); 
    NewParm.DbType = DbType.Int32; 
    // (or other data type, such as DbType.String, DbType.DateTime, etc) 
    MyUpdate.Parameters.Add(NewParm); 

    // Now, on to the next set of parameters... 
    NewParm = new OleDbParameter("ParmForAnotherField", NewValueForAnotherField); 
    NewParm.DbType = DbType.String; 
    MyUpdate.Parameters.Add(NewParm); 

    // finally the last one... 
    NewParm = new OleDbParameter("ParmForYourKeyField", CurrentKeyValue); 
    NewParm.DbType = DbType.Int32; 
    MyUpdate.Parameters.Add(NewParm); 



    // Now, you can do you 
    MyUpdate.ExecuteNonQuery(); 
+0

Merci espérons que cela fonctionnera. – sameer

16

Ce qui m'a ennuyé, çela petit OleDB, donc je posterai ma solution ici pour la postérité. C'est un ancien poste mais semble être un bon endroit.

OleDB ne reconnaît pas les paramètres nommés, mais reconnaît apparemment que vous êtes en essayant de transmettre un paramètre nommé, vous pouvez donc utiliser cela à votre avantage et rendre votre SQL sémantique et plus facile à comprendre. Tant qu'ils sont passés dans le même ordre, ils accepteront une variable comme paramètre nommé. Je l'ai utilisé pour mettre à jour une base de données Access simple dans un dossier réseau.

using (OleDbConnection conn = new OleDbConnection(connString)) 
{ 
     conn.Open(); 
     OleDbCommand cmd = conn.CreateCommand(); 

     for (int i = 0; i < Customers.Count; i++) 
     { 
      cmd.Parameters.Add(new OleDbParameter("@var1", Customer[i].Name)) 
      cmd.Parameters.Add(new OleDbParameter("@var2", Customer[i].PhoneNum)) 
      cmd.Parameters.Add(new OleDbParameter("@var3", Customer[i].ID)) 
      cmd.Parameters.Add(new OleDbParameter("@var4", Customer[i].Name)) 
      cmd.Parameters.Add(new OleDbParameter("@var5", Customer[i].PhoneNum)) 

      cmd.CommandText = "UPDATE Customers SET [email protected], [email protected]" + 
           "WHERE [email protected] AND (Name<>@var4 OR Phone<>@var5)"; 
      cmd.ExecuteNonQuery(); 
      cmd.Parameters.Clear(); 
     } 
} 

Il peut ressembler à un excès de code, et oui vous êtes techniquement vous répéter, mais cela rend plus facile mondes quand vous jouez connectez-les-points plus tard .....

+2

Assez sûr que vous venez de me sauver une autre heure ... essayant de comprendre pourquoi ma déclaration de mise à jour ne fonctionnait pas ... – agrath

0

Juste pour ajouter à la réponse de RJB, c'est un fait peu connu qu'OleDb accepte réellement les paramètres nommés. Vous devez également déclarer les paramètres dans SQL.

Voir: low-bandwidth.blogspot.com.au/2013/12/positional-msaccess-oledb-parameters.html

Si vous ne déclarez pas les paramètres dans SQL, OleDb utilise l'insertion des paramètres purement de position, et il n'a pas d'importance si les noms des paramètres correspondent à SQL, ou si les paramètres sont utilisés deux fois dans le SQL - il passera juste et remplacera aveuglément tous les paramètres trouvés dans le SQL dans l'ordre du début à la fin, avec ceux passés. Cependant, si vous déclarez les paramètres correctement, vous bénéficiez des paramètres et des paramètres nommés autorisés à être répétés plusieurs fois dans l'instruction SQL.