Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Создать/Сжать БД Access / 7 сообщений из 7, страница 1 из 1
06.11.2004, 04:55
    #32771615
_relib_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создать/Сжать БД Access
Привет всем.
Подскажите, пожалуйста, как программно а) создать, б) сжать базу данных Access ?
Заранее спасибо
...
Рейтинг: 0 / 0
06.11.2004, 05:24
    #32771616
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создать/Сжать БД Access
для создания - импортруй в проект Microsoft ADO Ext. for DDL and Security и вызови Catalog.Create

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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);
}
...
Рейтинг: 0 / 0
06.11.2004, 05:38
    #32771617
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создать/Сжать БД Access
сжатие БД Access - тоже reflection :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
// 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);
}
...
Рейтинг: 0 / 0
29.03.2005, 04:52
    #32985211
anton_gis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создать/Сжать БД Access
кузядля создания - импортруй в проект Microsoft ADO Ext. for DDL and Security и вызови Catalog.Create

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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. Открываю базу, пишет нераспознаваемый формат базы :(
Как исправить???
...
Рейтинг: 0 / 0
29.03.2005, 10:20
    #32985501
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создать/Сжать БД Access
попробуй в строке подключения указать одно из след. значений:

Jet OLEDB:Engine Type=3; // для Access 2
Jet OLEDB:Engine Type=4; // для Access 95, 97
Jet OLEDB:Engine Type=5; // для Access 2000 и выше
...
Рейтинг: 0 / 0
30.03.2005, 01:48
    #32987540
anton_gis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создать/Сжать БД Access
кузяпопробуй в строке подключения указать одно из след. значений:

Jet OLEDB:Engine Type=3; // для Access 2
Jet OLEDB:Engine Type=4; // для Access 95, 97
Jet OLEDB:Engine Type=5; // для Access 2000 и выше
спасибо, получилось :)
...
Рейтинг: 0 / 0
29.04.2005, 09:36
    #33042084
Создать/Сжать БД Access
Еще пример в ту же тему...
Код: plaintext
1.
2.
3.
4.
5.
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-объект каталога не будет освобожден сборщиком мусора.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Создать/Сжать БД Access / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]