Я ищу, чтобы иметь возможность динамически создавать связанные таблицы с С# в существующем файле accdb/mdb. Это возможно? Идея заключалась бы в том, что для каждой связанной таблицы ALREADY в данной базе данных доступа динамически создается новая связанная таблица, а затем вторая часть проблемы будет состоять в том, чтобы затем переименовать имя этой вновь созданной таблицы в ранее существующую таблицу.
Если его еще не ясно, происходит миграция из одной базы данных в другую, поэтому каждая предварительно существующая таблица имеет эквивалентную таблицу в новой базе данных, но она должна иметь то же имя в базе данных Access, чтобы запросы работали и т.д.
Возможно ли это?
РЕДАКТИРОВАТЬ:
Я создал тестовую базу данных, которая содержит одну связанную таблицу с базой данных ODBC. Я также создал простой запрос, который просто подсчитывает строки. Мой код С# сначала запускает запрос, а затем пытается изменить строку соединения с кодом:
var dbe = new DBEngine();
Database db = dbe.OpenDatabase(@"C:\Users\x339\Documents\Test.accdb");
foreach (TableDef tbd in db.TableDefs)
{
if (tbd.Connect.Length > 5)
{
if (tbd.Connect.Substring(0, 5).Equals("ODBC;"))
{
tbd.Connect = tbd.Connect.Replace("ODBC;DSN=ILACFEUC;UID=cloaseuc;DBQ=ILACFEUC;DBQ=W;APA=T;EXC=F;FEN=T;QTO=F;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=F;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=0;MLD=0;ODA=F;;TABLE=CLOASEUCDBA.T_BASIC_POLICY", "ODBC;DSN=ILACFEUC;UID=cloaseuc;DBQ=ILACFEUC;DBQ=W;APA=T;EXC=F;FEN=T;QTO=F;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=F;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=0;MLD=0;ODA=F;;TABLE=CLOASEUCDBA.T_BILLING_INFORMATION");
tbd.RefreshLink();
}
}
}
однако он не работает. Если я открою базу данных в доступе, строка подключения не изменится?
Похоже, вы действительно хотите изменить внешнюю базу данных, к которой подключены существующие связанные таблицы. В этом случае вы можете сделать это на С# следующим образом:
// This code requires the following COM reference in your project:
//
// Microsoft Office 14.0 Access Database Engine Object Library
//
// and the declaration
//
// using Microsoft.Office.Interop.Access.Dao;
//
// at the top of the class file
var dbe = new DBEngine();
Database db = dbe.OpenDatabase(@"C:\Users\Public\FrontEnd.accdb");
foreach (TableDef tbd in db.TableDefs)
{
if (tbd.Connect.Length > 10)
{
if (tbd.Connect.Substring(0, 10).Equals(";DATABASE="))
{
tbd.Connect = tbd.Connect.Replace("oldBackEnd.accdb", "newBackEnd.accdb");
tbd.RefreshLink();
}
}
}
db.Close();
.Connect
будут выглядеть по-разному (они будут начинаться сODBC;
вместо;DATABASE=
).