OLEDB UPDATE entre datagridview et base Excel
Bonjour,
Je fais appel à ce forum pour un problème qui me bloque depuis plusieurs semaines :
C'est la première fois que développe une application de gestion de données en utilisant OleDB pour gérer des contacts pour une association (pas trop le choix car j'ai + de 3000 lignes de contacts à gérer).
Ce que je cherche à faire, c'est :
- de charger les données Excel dans l'appli,
- de pouvoir faire des modifs directement par le datagridview,
- puis de sauvegarder les modifications faites dans le datagridview dans le fichier Excel.
Pour l'instant, et malgré beaucoup de temps passé :aie:, voici où j'en suis :
Chargement des données Excel dans le datagridview (en datasource) => OK
Code:
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
|
Private Sub ReadExcelFile(DGV As DataGridView, cheminXL As String)
ds = New DataSet()
If System.IO.Path.GetExtension(XLfilepath) = "xls" Then _
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cheminXL & "; Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""" _
Else connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cheminXL & "; Extended Properties=""Excel 12.0 XML;HDR=YES;IMEX=1;"""
Using conn As OleDbConnection = New OleDbConnection(connectionString)
conn.Open()
Dim cmd As OleDbCommand = New OleDbCommand()
cmd.Connection = conn
'Get all Sheets in Excel File
Dim dtSheets As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
'Loop through all Sheets to get data
For Each dr As DataRow In dtSheets.Rows
Dim sheetName As String = dr("TABLE_NAME").ToString()
If Not sheetName.EndsWith("$") Then Continue For
'Get all rows from the Sheet
cmd.CommandText = "SELECT * FROM [" & sheetName & "]"
Dim dt As DataTable = New DataTable()
dt.TableName = sheetName
da = New OleDbDataAdapter(cmd)
Dim cb = New OleDbCommandBuilder(da)
da.Fill(dt)
ds.Tables.Add(dt)
Next
cmd = Nothing
conn.Close()
End Using
End Sub |
=> Par contre, pas moyen de sauvegarder les modifs que j'apporte à la datagridview !!
Voici le code actuel que j'utilise :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
Sub Button2Click(sender As Object, e As EventArgs) Handles button2.Click 'boutn sauvegarde
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & XLfilepath & "; Extended Properties=""Excel 12.0 XML;HDR=YES;IMEX=1;"""
conn = New OleDbConnection(connectionString)
conn.Open()
ds.Tables(0).PrimaryKey = New DataColumn() {ds.Tables(0).Columns("id")}
da = New OleDbDataAdapter("Select * from [contacts$]", conn) 'contacts est le nom de l'onglet excel, et donc de la table
Dim cb = New OleDbCommandBuilder(da)
cb.QuotePrefix = "["
cb.QuoteSuffix = "]"
da.Update(ds.Tables(0))
Me.ds.AcceptChanges()
conn.Close()
End Sub |
Au final, ce code semble fonctionner (dataset rempli, table remplie avec le bon nom, etc...), mais il bloque à chaque fois sur :
"La génération SQL dynamique de UpdateCommand n'est pas prise en charge pour un SelectCommand qui ne retourne pas des informations de colonne clé."
Avez-vous une idée, car j'ai épuisé toutes les solutions que j'ai pu trouver... :roll: