Il existe de nombreux exemple d'export de données d'une application web vers un fichier Excel.
http://www.aspfr.com/code.aspx?ID=8935
On utilise en général le flux HTML avec comme ContentType = "application/vnd.ms-excel", l'autre méthode étant d'utiliser l'automation OLE, attention toute fois aux performances dans ce dernier cas.
Mais comment faire pour exporter vers Access ? On ne peut le faire, à ma connaisance, via un flux HTML.
En revanche on peut dans le cas de SQL Server faire appel aux lots DTS et appeller ces lots dans une application ASP.NET
Pour celà il faut utiliser un composant COM "Microsoft DTSPackage Object Library" qu'il faut référencer dans votre application ASP.NET
Le mode d'authentification doit être celle de SQL Server et non Windows donc pas de "Integrated Security=SSPI" dans la chaine de connection.
La démarche : (Format 2000 du fichier Access)
1° Conserver le système relationnel des données à exporter
Dans ce cas il faut préalablement créer un fichier modèle sur le server (model.mdb) avec les tables d'origines vides mais liées entre elles.
1°bis Si pas conservation du système relationnel des données à exporter
Dans ce cas on utilise un fichier modèle (model.mdb) totalement vide que l'on crée préalablement ou dynamiquement dans l'application ASP.NET en utilisant le composant COM ADOX "Microsoft ADO Ext. 2.8 for DDL and Security" mais pourquoi se compliquer ? Autant le créer avant et si on a besoin de le copier et de le renommer on utilisera les class .NET du System.IO
Le code de création dynamique d'un fichier Access est dans ce cas :
Imports ADOX
'Création d'un fichier Access
'path = "D:\TempFile\model.mdb"
Public Shared Function NewMDB(ByVal path As String) As String
Dim message As String = "Fichier Access créé correctement"
Try
Dim cat As ADOX.Catalog = New ADOX.Catalog
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & path & _
"Jet OLEDB:Engine Type=5")
cat.ActiveConnection.close()
cat = Nothing
Catch exc As System.Runtime.InteropServices.COMException
message = exc.Message()
Catch exc As Exception
message = exc.Message()
Finally
NewMDB = message
End Try
End Function
2° Création du Lot DTS
Inconvénient : le nom du fichier modèle "model.mdb" doit être connu à l'avance, il est peut-être possible d'utiliser les variables globales des lots DTS et de les passer en paramètre dans le code mais je n'ai pas trouvé la méthode
cf impr écran dans le doc dts.doc
3° Execution du lot DTS dans l'application ASP.NET
On peut se limiter à ce code :
Imports System.Runtime.InteropServices
Imports DTS
'Nom du lot = package = "ExportAccess"
Public Class ExportDTS
Function Execute(ByVal package As String) As String
Dim pkg As DTS.Package
Dim message As String = "Export ok"
Try
pkg = New DTS.Package
pkg.LoadFromSQLServer("Nom du server", "User", "Password", _
DTSSQLServerStorageFlags.DTSSQLStgFlag_Default, _
"", "", "", package, Nothing)
pkg.Execute()
pkg.UnInitialize()
pkg = Nothing
Catch exc As System.Runtime.InteropServices.COMException
mes sage = exc.Message()
Catch exc As Exception
message = exc.Message()
Finally
End Try
Execute = message
End Function
En revanche l'utilisation de la class PackageEventsSink sert à controler le bon déroulement de l'execution du lot DTS. Je ne maitrise malheureusement pas sa réelle utilité.
cf. 321525 HOW TO: Use DTS Package Events in Visual Basic .NET
http://support.microsoft.com/?id=321525