Создать/Сжать БД Access

_relib_
Дата: 06.11.2004 04:55:57
Привет всем.
Подскажите, пожалуйста, как программно а) создать, б) сжать базу данных Access ?
Заранее спасибо
кузя
Дата: 06.11.2004 05:24:38
для создания - импортруй в проект Microsoft ADO Ext. for DDL and Security и вызови Catalog.Create

есть еще один способ - через Reflection
(работает чуть медленнее, но не надо ничего подключать к проекту)

public string CreateMdb(string path, bool overwrite)
{
  string ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\""+path+"\";";
  object ax=null;    // объект ADOX.Catalog
  bool   mdb_exists; 
			
  try
  { // проверить существование mdb файла
    if((mdb_exists=File.Exists(path)) && !overwrite) return(ConnectionString);
    if(mdb_exists) File.Delete(path);
    // создать объект ADOX.Catalog
    Type tx=Type.GetTypeFromProgID("ADOX.Catalog");
    ax=Activator.CreateInstance(tx);
    // создать mdb БД
    tx.InvokeMember("Create", BindingFlags.InvokeMethod, null, ax, new object[]{ConnectionString});
  }
  catch(Exception ex)
  { // обработка ошибок
    ConnectionString=string.Empty;
  }
  finally
  { if(ax!=null) Marshal.ReleaseComObject(ax);
    ax=null;
  }
  return(ConnectionString);
}
кузя
Дата: 06.11.2004 05:38:03
сжатие БД Access - тоже reflection :)
// How To Compact Microsoft Access Database Through ADO
// http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q230501

public bool CompressMdb(string path)
{	
  string temp1="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\""+path+"\";";
  string file =Path.GetTempFileName(); // файл для временной БД
  string temp2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\""+file+"\";";
  object je=null; // объект JRO.JetEngine
  bool   ok=true; // код завершения сжатия БД
			
  try
  { //создать Microsoft Jet Replication Object
    Type tj=Type.GetTypeFromProgID("JRO.JetEngine");
    je=Activator.CreateInstance(tj);
				
    OleDbConnection.ReleaseObjectPool(); 
    if(File.Exists(file)) File.Delete(file); // удалить временный файл, созданный GetTempFileName();
    // сжать базу данных -> и копировать ее во временный файл
    tj.InvokeMember("CompactDatabase", BindingFlags.InvokeMethod, null, je, new object[]{temp1, temp2});
			
    // вот здесь нужно очень аккуратно:
    temp1=path+".bak";      // имя резервной копии БД
    if(File.Exists(temp1)) File.Delete(temp1);
    File.Move(path, temp1); // делаем резервную копию БД (переименование файла без копирования)
    File.Move(file, path);  // копировать сжатую/временную БД
    if(File.Exists(temp1)) File.Delete(temp1);
  }
  catch(Exception ex)		
  { /* обработка ошибок */
    ok=false; // облом
  }
  finally
  { if(je!=null) Marshal.ReleaseComObject(je);
    je=null;
  }
  return(ok);
}
anton_gis
Дата: 29.03.2005 04:52:39
кузя
для создания - импортруй в проект Microsoft ADO Ext. for DDL and Security и вызови Catalog.Create

есть еще один способ - через Reflection
(работает чуть медленнее, но не надо ничего подключать к проекту)

public string CreateMdb(string path, bool overwrite)
{
  string ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\""+path+"\";";
  object ax=null;    // объект ADOX.Catalog
  bool   mdb_exists; 
			
  try
  { // проверить существование mdb файла
    if((mdb_exists=File.Exists(path)) && !overwrite) return(ConnectionString);
    if(mdb_exists) File.Delete(path);
    // создать объект ADOX.Catalog
    Type tx=Type.GetTypeFromProgID("ADOX.Catalog");
    ax=Activator.CreateInstance(tx);
    // создать mdb БД
    tx.InvokeMember("Create", BindingFlags.InvokeMethod, null, ax, new object[]{ConnectionString});
  }
  catch(Exception ex)
  { // обработка ошибок
    ConnectionString=string.Empty;
  }
  finally
  { if(ax!=null) Marshal.ReleaseComObject(ax);
    ax=null;
  }
  return(ConnectionString);
}

попробовал через Reflection. Открываю базу, пишет нераспознаваемый формат базы :(
Как исправить???
кузя
Дата: 29.03.2005 10:20:00
попробуй в строке подключения указать одно из след. значений:

Jet OLEDB:Engine Type=3; // для Access 2
Jet OLEDB:Engine Type=4; // для Access 95, 97
Jet OLEDB:Engine Type=5; // для Access 2000 и выше
anton_gis
Дата: 30.03.2005 01:48:26
кузя
попробуй в строке подключения указать одно из след. значений:

Jet OLEDB:Engine Type=3; // для Access 2
Jet OLEDB:Engine Type=4; // для Access 95, 97
Jet OLEDB:Engine Type=5; // для Access 2000 и выше

спасибо, получилось :)
Никита А. Зимин
Дата: 29.04.2005 09:36:04
Еще пример в ту же тему...
ADOX.Catalog adoxCatalog = new ADOX.CatalogClass();
adoxCatalog.Create(AConnectionString);
object adoConnection = adoxCatalog.ActiveConnection;
adoConnection.GetType().InvokeMember(
        "Close", BindingFlags.InvokeMethod, null, adoConnection, new object[0]);
adoxCatalog = null;
Обратите внимание - соединение нужно закрывать! иначе оно останется открытым пока COM-объект каталога не будет освобожден сборщиком мусора.