Formulaires Excel 2007 à SQL Server

J'ai cherché partout une réponse sans succès au problème que je vais décrire.

J'ai une feuille Excel qui est mise à jour manuellement fréquemment. On m'a demandé de pousser chaque changement de ligne dans un server Sql, de façon dynamic. J'ai besoin que les users puissent save une ligne sur le server en appuyant sur un button de sauvegarde.

Dans SSMS, j'ai pu lire des données du server en utilisant OPENROWSET, par exemple:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;Database=C:\tmp\test2.xlsm', 'SELECT * FROM [myrng]'); 

J'ai également pu insert des données d'Excel vers SQL Server:

 Insert into NEWDB.dbo.master Select * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;Database=C:\tmp\test2.xlsm','SELECT * FROM [myrng]') 

Le problème se pose lorsque j'essaie de QUERY, INSERT ou UPDATE de revenir au server avec le file Excel toujours ouvert.

Ce que je prévois de faire à la fin est de build une application wizard pour remplir un tableau Excel qui à la fin du process pourrait être soumis à une table SQL Server correspondant.

J'ai joué avec VBA et ADO sans succès jusqu'ici, et on m'a suggéré d'utiliser DTS ou SSIS, mais j'ai besoin du file Excel pour restr ouvert tout le time.

Merci d'avance, Rodrigo.

Vous pourriez courir contre une connection à Excel:

 strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName _ & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" ''Late binding, so no reference is needed Set cn = CreateObject("ADODB.Connection") cn.Open strCon ''A single value, but a query with parameters would be better ssql = "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=server;Trusted_Connection=Yes;DATABASE=Test].table_1 (Atext ) " _ & "Values ('" & Sheet1.[b3] & "')" cn.Execute ssql 

Ou

 ssql = "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=server;" _ & "Trusted_Connection=Yes;DATABASE=Test].table_1 ( Atext ) " _ & "SELECT ACol FROM [Sheet1$b7:c9]" 

Ou

 ssql = "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=server;" _ & "Trusted_Connection=Yes;DATABASE=Test].table_1 ( Atext ) " _ & "SELECT Acol FROM Anamedrange" 

Si HDR = Non, utilisez F1, F2 etc. pour les noms des différentes colonnes, en numérotant à partir de la première colonne de la plage.

Cela fonctionne également pour moi dans Excel, pour cet exemple j'ai utilisé une reference à la bibliothèque Microsoft ActiveX Data Objects xx, mais la binding tardive fonctionnerait tout aussi bien.

 Dim cn As New ADODB.Connection Dim cmd As New ADODB.Command cn.Open servercon cmd.ActiveConnection = cn cmd.CommandText = "insert_user" ''Stored procedure cmd.CommandType = adCmdStoredProc cmd.Parameters("@username").Value = Worksheets("Sheet1").Cells(3, 2) cmd.Execute