2009-05-13 7 views
0

Lorsque plusieurs champs dans une table MSAccess doivent être mis à jour (Par exemple Salaire = Salaire * Facteur, SomeNumber = GetMyBusinessRuleOn (SomeNumber) etc ...), et le La mise à jour devrait affecter chaque enregistrement d'une table, quelle technique utiliseriez-vous?Quelle est la meilleure façon de mettre à jour une table MsAccess dans .NET

Je viens de commencer à mettre en œuvre ce avec DataSets, mais est resté coincé (Updating and persisting dataset problem)

Mais peut-être c'est même pas le moyen idéal pour gérer ce genre de mise à jour batch?

Remarque: les mises à jour ne doivent pas être sur les données déconnectées en premier, donc un jeu de données n'est pas nécessaire.

MISE À JOUR:

  • Une commande ne le fera pas, je besoin d'une sorte de curseur ou recordset pour faire défiler les enregistrements
+0

Une instruction SQL UPDATE * affecte * tous les enregistrements d'une table (sauf si vous ajoutez une condition de recherche, c'est-à-dire une clause WHERE). Pourquoi pensez-vous que vous devez parcourir les dossiers? – onedaywhen

+0

Je pense que je devrais passer en revue les dossiers, puisque la mise à jour implique des logiques commerciales complexes qui ne peuvent pas être exécutées contre le serveur, sth. Comme column1 = ApplyBussinessRule (Column2) où il n'y a aucun moyen d'implémenter ApplyBussinessRule sur le serveur. - Peter 52 secondes – Peter

+0

Avec le serveur signification databaseserver ou databaseapp comme msAccess – Peter

Répondre

1

Je voudrais simplement utiliser un OdbcConnection/ODBCCommand et utiliser un SQL Mettre à jour la requête

Il existe un pilote de base de données JET que vous devriez être en mesure d'utiliser pour établir une connexion de base de données à une base de données MSAccess à l'aide de l'objet ODBCConeection.

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\PathTo\\Your_Database_Name.mdb; User Id=admin; Password="; 

using (OdbcConnection connection = 
      new OdbcConnection(connectionString)) 
{ 
    // Suppose you wanted to update the Salary column in a table 
    // called Employees 
    string sqlQuery = "UPDATE Employees SET Salary = Salary * Factor"; 

    OdbcCommand command = new OdbcCommand(sqlQuery, connection); 

    try 
    { 
     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    // The connection is automatically closed when the 
    // code exits the using block. 
} 

Vous pouvez utiliser ces sites pour vous aider à générer une chaîne de connexion:

EDIT - Exemple d'utilisation d'un lecteur de données pour faire défiler les enregistrements afin de préciser la règle commerciale

Je devrais noter que l'exemple suivant pourrait être amélioré de certaines manières (particulièrement si le pilote de base de données supporte des requêtes paramétrées). Je voulais seulement donner un exemple relativement simple pour illustrer le concept.

using (OdbcConnection connection = 
      new OdbcConnection(connectionString)) 
{ 
    int someNumber; 
    int employeeID; 
    OdbcDataReader dr = null; 
    OdbcCommand selCmd = new OdbcCommand("SELECT EmployeeID, SomeNumber FROM Employees", connection); 

    OdbcCommand updateCmd = new OdbcCommand("", connection); 

    try 
    { 
     connection.Open(); 
     dr = selCmd.ExecuteReader(); 
     while(dr.Read()) 
     { 
      employeeID = (int)dr[0]; 
      someNumber = (int)dr[1]; 
      updateCmd.CommandText = "UPDATE Employees SET SomeNumber= " + GetBusinessRule(someNumber) + " WHERE employeeID = " + employeeID; 

      updateCmd.ExecuteNonQuery(); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    finally 
    { 
     // Don't forget to close the reader when we're done 
     if(dr != null) 
      dr.Close(); 
    } 
    // The connection is automatically closed when the 
    // code exits the using block. 
} 
+0

oui, tx, mais j'ai vraiment besoin de cycle les dossiers un par un – Peter

+0

Ensuite, vous pouvez utiliser un DataReader pour parcourir chaque enregistrement et effectuer la mise à jour de cette façon .. Voir la mise à jour –

+0

J'avais déjà implémenté cette méthode, mais elle semblait assez lente mais j'espérais qu'il y aurait une solution facile à la mise à jour de l'ensemble de données. Mais +1 pour la solution de travail et votre effort, tx. – Peter

Questions connexes