Запрос Sql, содержащий 2 базы данных
В С# я хочу выполнить запрос, в котором используются две разные базы данных (один - это доступ для локального, а другой - далекий и MySQL)
Я могу сделать это в VBA Access, но как я могу сделать то же самое в С#?
Вот как я сделал это в Access:
Свяжите мои 2 таблицы/базы данных differents в таблице
В VBA:
sSQL = "INSERT INTO DB1tblClient SELECT * FROM DB2tblClient"
CurrentDb.Execute sSQL
Как я могу выполнить этот SQL в С#? (Какой объект использовать и т.д. Пример кода, если вы можете)
Спасибо!
Ответы
Ответ 1
На самом деле вы должны иметь возможность запускать ту же самую команду SQL из любого приложения. Это предполагает:
- Вы подключаетесь к Access из своего приложения С#.
-
DB1tblClient
- это локальная таблица доступа
-
DB2tblClient
- это таблица ссылок в Access
При этом вы можете попробовать следующее:
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Stuff\MyAccessdb.mdb"))
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO DB1tblClient SELECT * FROM DB2tblClient";
cmd.ExecuteNonQuery();
}
}
Возможно, вы захотите проверить connectionstrings.com, если вы не можете правильно получить строку подключения, и вам может потребоваться установить некоторые компоненты ( MDAC или ACE) для соединений, которые используют эти провайдеры.
Ответ 2
Есть два способа сделать это. Один из них - настроить связанные таблицы в Access и запустить один запрос. Другой - запустить оба запроса из С# и объединить их с linq.
Первый способ лучше. Если вам действительно нужно это сделать с помощью linq, вот пример кода:
dWConnection.Open();
dWDataAdaptor.SelectCommand = dWCommand1;
dWDataAdaptor.Fill(queryResults1);
dWDataAdaptor.SelectCommand = dWCommand2;
dWDataAdaptor.Fill(queryResults2);
dWConnection.Close();
IEnumerable<DataRow> results1 = (from events in queryResults1.AsEnumerable()
where events.Field<string>("event_code").ToString() == "A01"
|| events.Field<string>("event_code").ToString() == "ST"
select events ) as IEnumerable<DataRow>;
var results2 = from events1 in queryResults1.AsEnumerable()
join events2 in queryResults2.AsEnumerable()
on (string)events1["event_code"] equals (string)events2["event_code"]
select new
{
f1 = (string)events1["event_code"],
f2 = (string)events2["event_name"]
};
DataTable newDataTable = new DataTable();
newDataTable = results1.CopyToDataTable<DataRow>();
Посмотрите, почему я сказал, что связанные таблицы лучше?
Ответ 3
Невозможно запустить такой сложный запрос с помощью одного оператора.
В основном каждый объект выполнения запроса, инициализированный конкретной информацией о базе данных,
поэтому для каждой базы данных требуется два разных объекта .
Теперь требуется 2 объекта с инициализацией со своим собственным объектом подключения.
Просто выберите данные по первому объекту и вставьте его в другую базу данных с помощью второго объекта соединения usin.
Ответ 4
Перед тем, как попробовать этот тип запроса, вам нужно учесть следующие моменты:
-
Оба баз данных доступны из вашего кода.
-
Между двумя базами данных существует взаимосвязь.
-
Обе базы данных доступны для пользователя, который вы используете для выполнения этого запроса.
-
Вам нужно указать запрос в следующем формате
DATABASE_NAME.SCHEMA_NAME.TABLE_NAME
вместо TABLE_NAME
ИЗМЕНИТЬ
Если у вас нет межсоединений между базами данных, вы можете выполнить следующие шаги.
-
Подключитесь к исходной базе данных, используя один connection
.
-
Прочитайте данные из исходной базы данных в dataset
или datatable
с помощью запроса SELECT
.
-
Подключитесь к целевой базе данных, используя второй connection
.
-
Вставьте все записи один за другим, используя цикл для базы данных TARGET, используя стандартный запрос INSERT