Запрос 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