none
Insertion de ligne dans une base MSAccess RRS feed

  • Question

  • Bonjour,

    Je bute sur quelque chose d'élémentaire et ne trouvant pas l'erreur je vous la soumet peut etre qu'un oeil neuf pourra m'aider :)

     

    J'essaie d'insérer dans une base access des lignes provenant d'une base SQLServer.

    Hors dès que j'update mon dataset j'ai l'erreur : "Erreur de syntaxe dans l'instruction INSERT INTO"

    Voici le code (qui sera plus explicite qu'un long texte) :

    Private CnxSD As SqlConnection
    Private CnxHi As OleDbConnection
    
    ...
    
    CnxHi = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=HisBaseP.mdb;")
    CnxHi.Open()
    
    ...
    
    Dim n As Integer
    Dim Ds As New DataSet
    Dim adapter As New OleDbDataAdapter
    Dim Dt As DataTable
    Dim Cmd As OleDbCommand
    Dim Bld As OleDbCommandBuilder
    Dim rowHi As DataRow
    Dim msCmd As String
    
    Try
        msCmd = "SELECT [Dat],Idx,Action,NLec,Detail,SCle,[Typ],Flag,Nom,Prenom,Divers,Duree FROM History"
    
        Cmd = New OleDbCommand(msCmd, CnxHi)
        adapter = New OleDbDataAdapter(Cmd)
        adapter.Fill(Ds, "History")
        Dt = Ds.Tables("History")
    
    Catch ex As Exception
        Info("    Erreur TraiteData : " + ex.Message)
        Return False
    End Try
    
    ' Parcours la source (SqlDataReader)
    For Each r In Rdr
    
            ' Création
            rowHi = Dt.NewRow()
            rowHi("Dat") = r("Time")
            rowHi("Idx") = r("UserNo")
            If r("MovementType") = 0 Then
                 rowHi("Action") = "E"
            Else
                rowHi("Action") = "S"
            End If
            rowHi("Nom") = r("UserSurname")
            rowHi("Prenom") = r("UserFIrstName")
            rowHi("Duree") = 0
    
            Dt.Rows.Add(rowHi)
            n += 1
    Next
    
    Bld = New OleDbCommandBuilder(adapter)
    Bld.GetInsertCommand()
    adapter.Update(Ds, "History")   ' -> Erreur ICI : Erreur de syntaxe dans l'instruction INSERT INTO
    
    Info("    " + n.ToString + " lignes importées")
    ...
    CnxHi.Close()
    
    
    


    Merci.

     

    Philippe.

     

     

     

    jeudi 24 novembre 2011 08:49

Réponses

  • Victoire !

    En espionnant les chaines de commande de l'adapteur de l'IDE, j'ai trouvé la syntaxe.

     

    Voici la chaine de commande fonctionnant :

            msCmd = "INSERT INTO `History` (`Date` ,`Idx`,`Action`, `NLec`, `Detail`, `SCle`, `Type`, `Flag`, `Nom`, `PreNom`, `Divers`, `Duree`) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11)"
    
            ' Parcours la source
            For Each r In Rdr
            
    
                Cmd = New OleDbCommand(msCmd, CnxHi)
    
                Cmd.Parameters.Add("@0", OleDbType.Date)
                Cmd.Parameters("@0").Value = r("Time")
    
                Cmd.Parameters.Add("@1", OleDbType.Integer)
                Cmd.Parameters("@1").Value = r("UserNo")
    
                Cmd.Parameters.Add("@2", OleDbType.VarChar)
                If r("MovementType") = 0 Then
                    Cmd.Parameters("@2").Value = "E"
                Else
                    Cmd.Parameters("@2").Value = "S"
                End If
    
                Cmd.Parameters.Add("@3", OleDbType.Integer)
                Cmd.Parameters("@3").Value = 0
    
                Cmd.Parameters.Add("@4", OleDbType.VarChar)
                Cmd.Parameters("@4").Value = "Detail"
    
                Cmd.Parameters.Add("@5", OleDbType.VarChar)
                Cmd.Parameters("@5").Value = "123456"
    
                Cmd.Parameters.Add("@6", OleDbType.SmallInt)
                Cmd.Parameters("@6").Value = 0
    
                Cmd.Parameters.Add("@7", OleDbType.SmallInt)
                Cmd.Parameters("@7").Value = 0
    
                Cmd.Parameters.Add("@8", OleDbType.VarChar)
                Cmd.Parameters("@8").Value = "Nom"
    
                Cmd.Parameters.Add("@9", OleDbType.VarChar)
                Cmd.Parameters("@9").Value = "Prenom"
    
                Cmd.Parameters.Add("@10", OleDbType.VarChar)
                Cmd.Parameters("@10").Value = "Div"
    
                Cmd.Parameters.Add("@11", OleDbType.Integer)
                Cmd.Parameters("@11").Value = 0
    
                Cmd.ExecuteNonQuery()
    
                If r("Time") > FrmStatsPolygone.MySettings.Settings.DernierImport Then FrmStatsPolygone.MySettings.Settings.DernierImport = r("Time")
                n += 1
            Next
    
    

     

    • Marqué comme réponse GPh jeudi 24 novembre 2011 17:20
    jeudi 24 novembre 2011 17:19

Toutes les réponses

  • Bonjour,

     

    Vous dites que vous voulez insérer des valeurs de SQL server vers acces mais je vois que vous faites un select sur une base access 

    Vous devez faire un select sur votre table dans une base sql server,vous bouclez les enregistrements et insérer les valeurs dans une base acces

     

    Dim cmd As New SqlCommand("select from ur sql server table ", con)
            Dim dr As DataRow
            cmd.CommandType = CommandType.Text
            Dim dr_sql As SqlClient.SqlDataReader
            con.Open()
            dr_sql = cmd.ExecuteReader
    
            Try
                Do While dr_sql.Read
                   
                    dr = dt.NewRow()
    'code d'insertion dans access base
    'vous recuperez les valeurs du datareader comme ceci
        ' Dim field1 As string = dr_sql.GetValue(0).ToString
                 '   Dim field2 As String = dr_sql.GetValue(1).ToString
    'etc 
                    Loop
            Catch ex As Exception
               
                con.Close()
            End Try


          


     

     


    Best Regards...Please mark as answer if my post is helpful

    • Modifié YosrJ jeudi 24 novembre 2011 10:29
    jeudi 24 novembre 2011 10:23
  • Certe ...

    Je n'ai pas mis le code de recup SQL, les données sont dans Rdr et parcourue sur le for each !

    Mon soucis n'est pas de lire les donnés mais dajouter des rows dans la base Access

     

    Je fais un select sur la base access pour créer le dataset auquel je veux ajouter mes lignes.

    Lignes que j'ajoute correctmeent dans la table mais qui lors de la mise à jour physique dans le fichier plante.

     

     

    jeudi 24 novembre 2011 10:31
  • Utilisez cette méthode ci dessous ça devrait marcher. Vous utilisez une requete insert et les valeurs insérées sont vos valeurs récupérés du datareader

     

         insertSql = "insert History ([Dat],Idx,Action,NLec,Detail,SCle,[Typ],Flag,Nom,Prenom,Divers,Duree) values (@[Dat],@Idx,@Action,......)"
            Using myConnection As New Oledb.OleDbConnection(connectionString)
                myConnection.Open()
                Dim myCommand As New Oledb.OledbCommand(insertSql, myConnection)
                myCommand.Parameters.AddWithValue("@[Dat]", r("Time"))
                ' etc
    
                myCommand.ExecuteNonQuery()
                myConnection.Close()
              
                
            End Using
    



    Best Regards...Please mark as answer if my post is helpful
    jeudi 24 novembre 2011 10:37
  • Ce qui est curieurx c'est que cela fait pareil !

     Alors que ça devrait marcher ...

     

    Y adoit y avoir autre chose qui gene mais je ne vois pas quoi ...

     

    L'exception System.Data.OleDb.OleDbException n'a pas été gérée
      ErrorCode=-2147217900
      Message=Erreur de syntaxe dans l'instruction INSERT INTO.
      Source=Microsoft JET Database Engine
      StackTrace:
           à System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
           à System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
           à System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
           à System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
           à System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
           à System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
           à Stats_Polygone.FrmSQL.TraiteData(SqlDataReader& Rdr) dans C:\Users\gph.MBE2003\Documents\Visual Studio 2010\Projects\Reports_Statistiques\Stats_Polygone\Stats_Polygone\FrmSQL.vb:ligne 214
           à Stats_Polygone.FrmSQL.BtnImport_Click(Object sender, EventArgs e) dans C:\Users\gph.MBE2003\Documents\Visual Studio 2010\Projects\Reports_Statistiques\Stats_Polygone\Stats_Polygone\FrmSQL.vb:ligne 68
           à System.Windows.Forms.Control.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnClick(EventArgs e)
           à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ButtonBase.WndProc(Message& m)
           à System.Windows.Forms.Button.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           à Stats_Polygone.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
           à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException: 
    
    

    jeudi 24 novembre 2011 14:37
  • Votre base access est 2007 ou 2010 ou version antérieure?

    Je sens que c'est un problème de provider ou de chaine de connexion

    Faites un débogage pas par pas pour voir ou ça bloque

    esssayez de changer votre chaine de connexion en précisant le chemin 

     

    "PROVIDER=Microsoft.Jet.OLEDB.4.0;DataSource=C:\votebase.mdb"
    et s'il y a un mot de passe vous l'ajoutez

     


    Best Regards...Please mark as answer if my post is helpful



    • Modifié YosrJ jeudi 24 novembre 2011 14:56
    jeudi 24 novembre 2011 14:39
  • Format : Access 2000

    Pas de mot de passe

    En local sans pb de securité

    S'ouvre normalement avec Access

    Je vais faire quelques tests, merci

     

    Ca bloque sur le ExecuteNonQuery() (ou sur l'update dans la version avec Dataset)

     

     

     

     


    • Modifié GPh jeudi 24 novembre 2011 15:12
    jeudi 24 novembre 2011 15:08
  • Pas moyen, ca ne marche toujours pas.

    J'ai meme convertit la base en 2007, changé la chaine de cconexion, supprimé les index, mis une clé primaire, enfin pas mal d'essais sans succès.

    Il y a vraimeent quelque chose qui m'échape !

     

     

    jeudi 24 novembre 2011 15:30
  • Victoire !

    En espionnant les chaines de commande de l'adapteur de l'IDE, j'ai trouvé la syntaxe.

     

    Voici la chaine de commande fonctionnant :

            msCmd = "INSERT INTO `History` (`Date` ,`Idx`,`Action`, `NLec`, `Detail`, `SCle`, `Type`, `Flag`, `Nom`, `PreNom`, `Divers`, `Duree`) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11)"
    
            ' Parcours la source
            For Each r In Rdr
            
    
                Cmd = New OleDbCommand(msCmd, CnxHi)
    
                Cmd.Parameters.Add("@0", OleDbType.Date)
                Cmd.Parameters("@0").Value = r("Time")
    
                Cmd.Parameters.Add("@1", OleDbType.Integer)
                Cmd.Parameters("@1").Value = r("UserNo")
    
                Cmd.Parameters.Add("@2", OleDbType.VarChar)
                If r("MovementType") = 0 Then
                    Cmd.Parameters("@2").Value = "E"
                Else
                    Cmd.Parameters("@2").Value = "S"
                End If
    
                Cmd.Parameters.Add("@3", OleDbType.Integer)
                Cmd.Parameters("@3").Value = 0
    
                Cmd.Parameters.Add("@4", OleDbType.VarChar)
                Cmd.Parameters("@4").Value = "Detail"
    
                Cmd.Parameters.Add("@5", OleDbType.VarChar)
                Cmd.Parameters("@5").Value = "123456"
    
                Cmd.Parameters.Add("@6", OleDbType.SmallInt)
                Cmd.Parameters("@6").Value = 0
    
                Cmd.Parameters.Add("@7", OleDbType.SmallInt)
                Cmd.Parameters("@7").Value = 0
    
                Cmd.Parameters.Add("@8", OleDbType.VarChar)
                Cmd.Parameters("@8").Value = "Nom"
    
                Cmd.Parameters.Add("@9", OleDbType.VarChar)
                Cmd.Parameters("@9").Value = "Prenom"
    
                Cmd.Parameters.Add("@10", OleDbType.VarChar)
                Cmd.Parameters("@10").Value = "Div"
    
                Cmd.Parameters.Add("@11", OleDbType.Integer)
                Cmd.Parameters("@11").Value = 0
    
                Cmd.ExecuteNonQuery()
    
                If r("Time") > FrmStatsPolygone.MySettings.Settings.DernierImport Then FrmStatsPolygone.MySettings.Settings.DernierImport = r("Time")
                n += 1
            Next
    
    

     

    • Marqué comme réponse GPh jeudi 24 novembre 2011 17:20
    jeudi 24 novembre 2011 17:19