Come si crea un database Microsoft Jet (Access) senza un assembly di interoperabilità?
Domanda
Devo creare un database di accesso (mdb) senza usare l'assembly di interoperabilità ADOX.
Come si può fare?
Soluzione
Prima di buttare via questo codice, potrebbe anche vivere su stackoverflow
Qualcosa del genere sembra fare il trucco:
if (!File.Exists(DB_FILENAME))
{
var cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DB_FILENAME;
// Use a late bound COM object to create a new catalog. This is so we avoid an interop assembly.
var catType = Type.GetTypeFromProgID("ADOX.Catalog");
object o = Activator.CreateInstance(catType);
catType.InvokeMember("Create", BindingFlags.InvokeMethod, null, o, new object[] {cnnStr});
OleDbConnection cnn = new OleDbConnection(cnnStr);
cnn.Open();
var cmd = cnn.CreateCommand();
cmd.CommandText = "CREATE TABLE VideoPosition (filename TEXT , pos LONG)";
cmd.ExecuteNonQuery();
}
Questo codice mostra che è possibile accedere al database usando OleDbConnection una volta creato con il componente COM ADOX.Catalog.
Altri suggerimenti
Ho fatto lo stesso di Autsin, ho creato un db di Access e poi l'ho incluso nel mio progetto come risorsa gestita. Una volta lì, è incluso nel codice compilato e puoi copiarlo sul disco rigido tutte le volte che vuoi. Anche i database vuoti sono relativamente piccoli, quindi non c'è molto overhead.
Il bonus aggiunto è la possibilità di impostare il database se si sa come verrà utilizzato o quali tabelle verranno aggiunte ogni volta, è possibile ridurre la quantità di codifica e rallentare le query del database.
Non è necessario installare Jet (mal di testa maggiore), se si utilizza questa stringa di connessione in .net 3.5
Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:\myFolder\myAccess2007file.accdb;Persist
Security Info=False;
Questo dovrebbe funzionare con accesso 2007 e successivi
Domanda interessante: non ho mai pensato di crearne uno al volo in questo modo. Ho sempre incluso il mio database di base come risorsa nel progetto e ne ho fatto una copia quando ne avevo bisogno di uno nuovo.
ACE non è in nessun framework (ancora. cioè non in 1, 2, 3.5, 4, 4.5)
Inoltre, non fa parte di Windows Update.
JET4 è in Framework2 e versioni successive.
Se stai lavorando con file Access / MDB ecc., allora non dare per scontato che sia presente ACE.