2009-12-08 4 views
0

Je voudrais insérer des données dans une base de données Access.Utiliser OleDbDataAdapter pour insérer dans un Access db

DataTable dt = new DataTable(); 
String sql = string.Format("SELECT * FROM {0} where 1=0; ", tmap.SqlTableName); 
string con = string.Format(conn, accessPath); 
OleDbDataAdapter da = new OleDbDataAdapter(sql, con); 
OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(da); 
da.InsertCommand = cmdBuilder.GetInsertCommand(true); // Returns "INSERT INTO test (int, bdate, amt, text, bit) VALUES (?, ?, ?, ?, ?)" 
da.Fill(dt); 
//Add data to the DateTable 
for (int i = 0; i < rowCount; i++) 
{ 
DataRow dr = dt.NewRow(); 
//.... 
dt.Rows.Add(dr); 
} 
da.Update(dt); //This is where things go south. 

System.Data.OleDb.OleDbException
Message: Erreur de syntaxe dans l'instruction INSERT INTO.
Source: Moteur de base de données Microsoft JET.

Si je change la commande d'insertion:

da.InsertCommand = new OleDbCommand("INSERT INTO test ([text]) VALUES (?)"); 

et de modifier les données entrantes seulement une valeur de texte unique que je reçois:

Aucune valeur donnée pour un ou plusieurs paramètres requis.

Ai-je raté quelque chose?

+0

La commande da.Update (dt) ne doit-elle pas se trouver dans la boucle FOR, c'est-à-dire à l'intérieur de {}? –

+0

Déplacer le da.Update (dt) à côté de la boucle FOR créerait simplement une nouvelle connexion à la base de données chaque fois que j'ajouterais une ligne, non? - Quoi qu'il en soit, cela n'aide pas le problème majeur. – NitroxDM

+0

Vous avez ouvert votre connexion en dehors de la boucle, donc je ne sais pas pourquoi la mise à jour créerait une nouvelle connexion. Bien sûr, vous utilisez une technologie (oledbdataadapter) dont je ne sais rien. Dans les bibliothèques d'accès aux données habituelles utilisées avec Jet/ACE, vous devez mettre à jour chaque ligne individuellement, c'est-à-dire que vous ne pouvez pas mettre en lot les mises à jour. Mais peut-être que ce que vous utilisez fonctionne différemment et lots par défaut. Et peut-être que c'est comme ça que ça fonctionne habituellement avec un backend de serveur et ne fonctionne peut-être pas avec Jet/ACE. Je devine juste ici. –

Répondre

1

La question était dans les types de données. Le code de la question fonctionne si les types de données sont compatibles.

0
  1. Assurez-vous que toutes les colonnes requises sont incluses dans la requête d'insertion.
  2. S'il ne crée fonctionne pas alors une nouvelle méthode pour insérer et suivre ceci:

    OleDbConnection conn = new OleDbConnection (connectionString);

    OleDbCommand command = new OleDbCommand(); 
    command.Connection = conn; 
    command.CommandText= "INSERT INTO myTable (col1, col2) VALUES (@p_col1, @p_col2)"; 
    command.Parameters.Add ("@p_col1", OleDbType.String).Value = textBox1.Text; 
    ... 
    command.ExecuteNonQUery(); 
    
+0

1. J'ai supprimé toutes les colonnes de la base de données sauf pour le texte. Pas de dé. 2. C'est ce que je faisais auparavant ... mais il y a plus de 150 tables dans la base de données d'accès et elles vont changer. Je cherchais donc le moyen le plus simple d'être aussi dynamique que possible. Le constructeur de commande ressemblait à un bon ajustement automagical. Mais cela ne semble pas fonctionner pour l'insertion. Il semblerait que je devrais rouler mon propre constructeur de sql pour celui-ci. – NitroxDM

Questions connexes