Creazione di un Database di Access con C# e VB.NET

Il Framework .NET non contiene classi che permettono di creare un database di Access.

Ipotizzo che reputandolo di scarsa, scarsissima importanza (cosa che mi trova del tutto concorde), Microsoft ha pensato bene di non inserire tale feature su .NET.

A mio avviso il modo più felice di creare un database di Access è quello di aggiungerlo al proprio "setup" di installazione e/o di includerlo come risorsa in una DLL di .NET.

In genere i costruttori di database server hanno implementato al proprio interno la possibilità di creare, modificare e cancellare database e tabelle tramite l'utilizzo di comandi SQL.

Access è sprovvisto di tale implementazione, ecco pertanto  che per poter creare un database è necessario operare nel seguente modo:

  • Inserire un riferimento a Microsoft ActiveX Data Object 2.8 Library
  • Inserire un riferimento a Microsoft ADO Ext 2.8 DDL and Security

Tali oggetti si possono trovare tra gli oggetti COM nella finestra dei riferimenti del progetto.

La sintassi è quella che già conosciamo per VB6.

C#

/*

 * Created by SharpDevelop.

 * User: luciano

 * Date: 17/05/2004

 * Time: 19.28

 *

 */

using System;

 

 

namespace GeneraAccess

{

      class MainClass

      {

            public static void Main(string[] args)

            {

                  if (args.Length == 0)

                  {

                        Console.WriteLine("Nessun Parametro");

                        return;

                  }

                  CreaKeys(args[0]);

            }

 

            private static void CreaKeys(string DataBaseName)

            {

                  ADODB.Connection Cn;

                  ADOX.Catalog Cat;

                  ADOX.Table objTable;

                  ADOX.Key objKey;

           

                  Cn       = new ADODB.Connection();

                  Cat      = new ADOX.Catalog();

                  objTable = new ADOX.Table();

                  objKey   = new ADOX.Key();

                  try

                  {

                        if (! System.IO.File.Exists(DataBaseName))

                        {

                       

                             ADOX.CatalogClass catAdox = new ADOX.CatalogClass();

                             catAdox.Create("Provider=Microsoft.Jet.OLEDB.4.0;" +

                             "Data Source=" + DataBaseName + ";" +

                             "Jet OLEDB:Engine Type=5");

                        }

                        Cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DataBaseName + ";",String.Empty,String.Empty,-1);

                        Cat.ActiveConnection = Cn;

                        objTable.Name = "Test_Table";

 

                        objTable.Columns.Append("PrimaryKey_Field1", ADOX.DataTypeEnum.adInteger,0);

                        objTable.Columns.Append("PrimaryKey_Field2", ADOX.DataTypeEnum.adInteger,0);

 

                        objKey.Name = "PrimaryKey";

                        objKey.Type = ADOX.KeyTypeEnum.adKeyPrimary;

                        objKey.Columns.Append("PrimaryKey_Field1",ADOX.DataTypeEnum.adVarWChar,0);

                        objKey.Columns.Append("PrimaryKey_Field2",ADOX.DataTypeEnum.adVarWChar,0);

 

                        objTable.Keys.Append(objKey,ADOX.KeyTypeEnum.adKeyPrimary,System.Reflection.Missing.Value,"","");

 

                        Cat.Tables.Append(objTable);

                  }

                  catch (Exception ex)

                  {

                        Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);

                  }

 

 

                  // clean up objects

                  objKey   = null;

                  objTable = null;

                  Cat      = null;

                  Cn.Close();

                  Cn       = null;

            }

      }

}

VB.NET

'

' * Created by SharpDevelop.

' * User: luciano

' * Date: 17/05/2004

' * Time: 19.28

' *

'

Imports System

 

 

Namespace GeneraAccess

      Class MainClass

            Public Shared Sub Main(ByVal args As String())

                  If args.Length = 0 Then

                        Console.WriteLine("Nessun Parametro")

                        Return

                  End If

                  CreaKeys(args(0))

            End Sub

 

            Private Shared Sub CreaKeys(ByVal DataBaseName As String)

                  Dim Cn As ADODB.Connection

                  Dim Cat As ADOX.Catalog

                  Dim objTable As ADOX.Table

                  Dim objKey As ADOX.Key

 

                  Cn = New ADODB.Connection()

                  Cat = New ADOX.Catalog()

                  objTable = New ADOX.Table()

                  objKey = New ADOX.Key()

                  Try

                        If Not System.IO.File.Exists(DataBaseName) Then

 

                             Dim catAdox As New ADOX.CatalogClass()

                             catAdox.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + DataBaseName + ";" + "Jet OLEDB:Engine Type=5")

                        End If

                        Cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DataBaseName + ";", [String].Empty, [String].Empty, -1)

                        Cat.ActiveConnection = Cn

                        objTable.Name = "Test_Table"

 

                        objTable.Columns.Append("PrimaryKey_Field1", ADOX.DataTypeEnum.adInteger, 0)

                        objTable.Columns.Append("PrimaryKey_Field2", ADOX.DataTypeEnum.adInteger, 0)

 

                        objKey.Name = "PrimaryKey"

                        objKey.Type = ADOX.KeyTypeEnum.adKeyPrimary

                        objKey.Columns.Append("PrimaryKey_Field1", ADOX.DataTypeEnum.adVarWChar, 0)

                        objKey.Columns.Append("PrimaryKey_Field2", ADOX.DataTypeEnum.adVarWChar, 0)

 

                        objTable.Keys.Append(objKey, ADOX.KeyTypeEnum.adKeyPrimary, System.Reflection.Missing.Value, "", "")

 

                        Cat.Tables.Append(objTable)

                  Catch ex As Exception

                        Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace)

                  End Try

 

 

                  ' clean up objects

                  objKey = Nothing

                  objTable = Nothing

                  Cat = Nothing

                  Cn.Close()

                  Cn = Nothing

            End Sub

      End Class

End Namespace

 

 

Print | posted on sabato 3 febbraio 2007 00:33

Feedback

# Codice utile

Left by Jakkomin at 08/06/2006 21:14
Gravatar Di solito da .net utilizzo MySQL ma ho dovuto implementare l'esportazione in Access e ho trovato questo esempio utile (da VB6 è praticamente uguale)

Grazie!

p.s. cercate di usare Access solo se indispensabile!!!

# re: Creazione di un Database di Access con C# e VB.NET

Left by sanpeinet at 20/04/2007 20:28
Gravatar Access va usato per gli scopi per cui è stato progettato. Tutto qui.
Inutile fare polemiche del cavolo.

# [ADO.NET & VB.NET 2003] Creare DB Access - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 09/08/2007 19:53
Gravatar [ADO.NET & VB.NET 2003] Creare DB Access - MasterDrive.it - Information Technology Developers Community

# COMException - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 13/02/2008 23:31
Gravatar COMException - MasterDrive.it - Information Technology Developers Community

# Estrarre un database - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 15/02/2008 00:10
Gravatar Estrarre un database - MasterDrive.it - Information Technology Developers Community

# re: Creazione di un Database di Access con C# e VB.NET

Left by Enzo at 11/04/2008 12:32
Gravatar In effetti, posso e non posso essere daccordo con te sul fatto che vb.net non abbia la possibilità di poter creare un database in access. Il problema è che il mio programma gia fatto e che vorrei tanto rimodernare con vb.net aveva un database su cui lavorare ed un'altro di servizio dove vi erano le regole fondamentali per gestire delle tabelle. Il problema maggiore e che questo oltre ad avere il funzionamento in locale e quindi con il suo database locale, dovrebbe avere la possibilità di potersi connettere in una rete lan e dove ogni client potrebbero fare riferimento ad un solo datbase , quindi qui nasce la necessita di poterlo creare. La cosa piu giusta sarebbe quella di lavorare con mysql, ma ho incontrato tantissime difficolta
Certo dire SELECT o FROM o WHERE è abbastanza semplice, ma il linguaggio sql non è certamente questo e la guida in linea non è certamente molto chiara a tal proposito e gia il fatto di dover creare un database sql e connettersi con la classica stringa di connessione, sono elementi gia ostici da parte mia. Quando sei solo e devi sbattere la testa senza poterti confrontare con nessuno su qualche problema, il muro diventa veramente alto.
Questo è il mio pensiero.

# re: Creazione di un Database di Access con C# e VB.NET

Left by Luciano Bastianello at 11/04/2008 12:38
Gravatar Non sono io ma Microsoft che non sostiene per nulla l'utilizzo di access su .net.
Il mio consiglio è di buttarlo a mare e usare sql express o sql ce

# re: Creazione di un Database di Access con C# e VB.NET

Left by Enzo at 12/04/2008 00:06
Gravatar Allora visto che sono completamente a digiuno e ci sto sbattendo la testa con sql express (installato con visual studio 2008 enterprise) il mio problema è questo:
creare una connessione senza utilizzare il nome di database.
Una volta creata la connessione al server (locale o su rete scelta dell'utente finale) creare nella connessione e nella cartella un nuovo database che ovviamente verra riempito con le dovute tabelle.

sto provando, ma senza risultati, altrimenti non sarei qui a discutere questo:
dim connection as new sqlclient.sqlconnection
connection=" qui la stringa di una connessione effettuata tramite sqlconnection1 ma ovviamente è specificato il nome del database e non va bene"
connection.open()

Ho provato a togliere dalla stringa AttachDbfilename=
ma ovviamente non va bene
e dopo ho creato questa query per costruire un nuovo database

dim command as new sqlclient.sqlcommand
command.commandtext="CREATE DATABASE NomeDatabase.mdf"
command.executenoquery()

ovviamente non funziona un tubo, ma purtroppo al momento non riesco ad andare oltre se non con tentativi inutili.
AIUTO

#  Creare un .mdb - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 16/11/2008 22:53
Gravatar Creare un .mdb - MasterDrive.it - Information Technology Developers Community

# [vb.net] Creare un database | hilpers

Left by Pingback/TrackBack at 18/01/2009 16:30
Gravatar [vb.net] Creare un database | hilpers

# creazione db da VB | hilpers

Left by Pingback/TrackBack at 21/01/2009 18:21
Gravatar creazione db da VB | hilpers

# Errore nel codice C# o diverso per il framework 4

Left by Gabriele Martino at 09/06/2010 19:51
Gravatar Per il codice c# è Catalog e non CatalogClass

# re: Creazione di un Database di Access con C# e VB.NET

Left by Luciano Bastianello at 09/06/2010 20:11
Gravatar Verificherò quanto segnali ma .. quello che è certo che provo SEMPRE gli esempi prima di pubblicarli.

# re: Creazione di un Database di Access con C# e VB.NET

Left by Gabriele Martino at 16/06/2010 19:33
Gravatar Sempre per il Framework 4 ho costatato un mio problema nel risucire attraverso il tuo codice a chiudere la connessione con il file creato per gestire una cancellazione del file nella stessa sessione di programma. Nei framework precedente si risolveva attraverso la classe Marshal. Nel FW 4 con Visual C# 2010 invece ho visto che si può chiudere la connessione con l'oggetto Catalog in un forma del tipo mettere prima del try

ADOX.Catalog catAdox = new ADOX.Catalog();

try

{
... code ...

}

// clean up object

...code here ...

Cn = null;

catAdox.ActiveConnection.Close();

catAdox.ActiveConnection = null;

/* code here */



# re: Creazione di un Database di Access con C# e VB.NET (Ancora di meglio)

Left by Gabriele Martino at 17/06/2010 17:05
Gravatar Ciao,

scusate se ho pasticciato nel sito ma sono andato per gradi. C'è ancora una soluzione migliore e parlo per chi possiede un Access 2003 e un Visual c# 2010. Infatti il metodo riadattato da me su esposto non crea sempre le tabelle all'interno perchè gli oggetti Adox sembrano destinati a scomparire, al loro posto ci sono gli OleDb che però mancano della funzione di creazione di un Db o almeno io non l'ho trovata.

Prima di tutto creare tramite l'oggetto Catalog di cui sopra il DB, quindi chiudere la connessione con tale oggetto come mostrato sopra.
Questa crerà un DB Access 2000 e ancora non so come si fa a mettere un Access 2003.

Poi Manipolare il DB con Oledb anzichè con gli oggetti Adox con l'uso di espressioni SQL del tipo "CREATE TABLE NomeTabella (campoIntero Long, Campotesto Char(50), ...);"

Cosi risulta + stabile.

Your comment:





 
Please add 1 and 7 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski