IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Mise à jour de DB Access: Erreur de syntaxe dans l'instruction INSERT INTO


Sujet :

VB.NET

  1. #1
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut Mise à jour de DB Access: Erreur de syntaxe dans l'instruction INSERT INTO
    Bonjour,

    Je dois copier des records d'une table à une autre et je m'emmêle les pinceaux entre les DataSet, DataAdapter, DataTable et autre DataRow...
    Je me perds dans l'aide Microsoft qui est, soit incomplète (uniquement la syntaxe pour la copie), soit ne correspond pas à mon besoin.

    Ma première table est une table construite. Elle ne vient pas d'une base de données.

    La deuxième, par contre, est dans une DB (Access 2010).
    Et le résultat de la copie doit se retrouver, in fine, dans cette DB.

    Les champs sont identiques. Mêmes noms et mêmes types.

    La copie des records d'une table à l'autre ne me pose pas problème.
    C'est pour actualiser la DB que je rame.

    La table destination est bien liée à la DB au travers d'un OleDbDataAdapter.
    Après la copie, j'essaie un adapter.Update mais j'obtiens ce message d'erreur:

    Erreur de syntaxe dans l'instruction INSERT INTO.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
      Function CopyToDb(ByRef tblSource As DataTable, ByVal strDbFile As String) As Boolean
        Dim adapter As OleDbDataAdapter
        Dim connection As New OleDbConnection
        Dim ds As New DataSet
        Dim fi As New FileInfo(strDbFile)
        Dim strConnect As String = ""
        Dim strTable As String = ""
        Dim tblDest As DataTable
     
        If Not fi.Exists Then
          MsgBox(String.Format("The file {0} doesn't exist", strDbFile))
          Return False
          Exit Function
        End If
     
        Select Case fi.Extension.ToUpper
          Case ".ACCDB"
            strConnect = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Jet OLEDB:Database Password={1};", strDbFile, "ThePassword")
            strTable = "CounterParty"
            connection.ConnectionString = strConnect
     
            Try
              connection.Open()
     
              adapter = New OleDbDataAdapter("SELECT * FROM " & strTable & ";", connection)
              Dim cmdBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)
              adapter.Fill(ds)
              tblDest = ds.Tables(0)
     
              For Each record As DataRow In tblSource.Rows
     
                tblDest.ImportRow(record)
     
              Next
     
              adapter.InsertCommand = cmdBuilder.GetInsertCommand(True)
     
              adapter.Update(tblDest) ' <=== Erreur ici: Erreur de syntaxe dans l'instruction INSERT INTO.
            Catch ex As Exception
              MsgBox(ex.Message)
              Return False
            End Try
     
            Return True
          Case Else
            Return False
        End Select
     
      End Function
    Voici la String InsertCommand générée par le CommandBuilder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO CounterParty (Name, NickName, AccountNumber, AccountCountry) VALUES (?, ?, ?, ?)
    J'ai volontairement tronqué cette ligne à 4 champs pour raison de confidentialité. En réalité, il y en a 27.

    Merci à ceux qui se pencheront sur le problème.

    Visual Studio 2010.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  2. #2
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Histoire de bien comprendre ...

    En résumant grossièrement et en zappant qlqes trucs, tu as une fonction qui prend en paramètre une DataTable rempli (DT1), tu charges dans une 2éme DataTable (T2) une table ACCESS, tu rajoutes à la fin de T2, le contenu de T1, et tu écrases ta table ACCESS (celle qui a remplie T2) avec ta T2 fraîchement re-remplie, c'est bien ça ? Et c'est bien ce que tu souhaites faire ?

    On peut fouiner un peu et voir la structure de T2 avant et après ton remplissage avec .ImportRow(), histoire d'être sûr que le format est bien le même pour les nouvelles lignes ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       Console.WriteLine(String.Join("|", tblDest.Rows(tblDest.Rows.Count - 1).ItemArray))
     
                        For Each record As DataRow In tblSource.Rows
     
                            tblDest.ImportRow(record)
     
                        Next
     
                        Console.WriteLine(String.Join("|", tblDest.Rows(tblDest.Rows.Count - 1).ItemArray))


    Egalement on peut mettre un point d'arrêt sur adapter.Update(tblDest) et survoler tblDest avec le curseur pour voir les valeurs qu'il contient.


    NB: "Erreur de syntaxe dans l'instruction INSERT INTO." provient parfois d'un nom de colonne ou de table qui utilise un des mots-clés reservés d'ACCESS ...
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  3. #3
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Merci pour ton intérêt.

    Oui, tu as bien résumé mon besoin.

    J'ai remplacé ton Console.WriteLine par un Debug.Print.
    La première occurrence ne peut aboutir car la table de destination ne comporte aucun record dans le cas de figure.
    Je pourrais tester avec une autre DB mais ne peux le faire dans l'immédiat.

    Ce qui me tracasse, c'est que l'import se passe correctement. Le nombre de records après import est correct.
    L'InsertCommand me semble correcte également. Je rappelle qu'elle est créee par le CommandBuilder, ce n'est pas moi qui l'ai écrite.

    Juste un détail: La table de destination comporte un champ AutoNumber.
    Que j'ajoute la colonne (sans y mettre de valeur) ou pas dans la table source, l'InsertCommand est identique et ne comporte pas ce champ.
    Dans le Debug.Print, le numéro n'apparaît pas mais la première valeur est précédée d'un "|". J'en conclus que le champ est présent.
    Peut-être le numéro se met-il à jour au moment de l'écriture dans la DB?

    En parcourant tous les noms de champs, je n'en vois qu'un qui pourrait poser problème. Il se nomme Currency.
    Je vais faire des tests de ce côté en renommant le champ.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  4. #4
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    En parcourant tous les noms de champs, je n'en vois qu'un qui pourrait poser problème. Il se nomme Currency.
    Je vais faire des tests de ce côté en renommant le champ.

    Access 2007 reserved words and symbols

    Currency est effectivement réservé. Ce sera déjà une épine de moins à enlever.

    Néanmoins s'il reste des épines, tu peux toujours commencer à te pencher sur l'event OnRowUpdating du DbDataAdapter qui prend en paramètre un RowUpdatingEventArgs qui possède une property .Command retournant la IDbCommand à exécuter pendant l'opération Update.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Peut-être le numéro se met-il à jour au moment de l'écriture dans la DB?
    C'est bien le cas.

    Pour récupérer après l'Upddate() ce champ dans la(es) Row(s) de la dataTable, on peut gèrer l'event RowUpdated du DataAdapter (code C#):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       internal void Adapter_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
        {
          if (e.StatementType==StatementType.Insert)
          {
            OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY",connexion);
            e.Row[AutoIncrementColumnName] = cmd.ExecuteScalar();
          }
        }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par _Ez3kiel Voir le message
    Currency est effectivement réservé. Ce sera déjà une épine de moins à enlever.


    Big merci. C'était bien ça.
    J'ai remplacé l'InsertCommand du CommandBuilder par une "faite main" avec le champ Currency entre crochets et plus d'erreur de syntaxe.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Erreur de syntaxe dans l'instruction INSERT INTO
    Par IL-MAFIOSO dans le forum VB.NET
    Réponses: 15
    Dernier message: 21/03/2013, 14h54
  2. [AC-2007] Erreur de syntaxe dans l'instruction INSERT INTO
    Par DébutantAccess dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/02/2013, 18h45
  3. OleDbException -{"Erreur de syntaxe dans l'instruction INSERT INTO."}
    Par daniel.moreda dans le forum Framework .NET
    Réponses: 1
    Dernier message: 27/09/2011, 16h38
  4. Erreur de syntaxe dans l'instruction INSERT INTO
    Par doolar dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2008, 15h37
  5. Erreur de syntaxe dans l'instruction INSERT INTO
    Par logiciel_const dans le forum Bases de données
    Réponses: 8
    Dernier message: 19/03/2008, 10h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo