2008-10-27 2 views
5

У меня есть две базы данных, одна - файл MS Access, другая - база данных SQL Server. Мне нужно создать команду SELECT, которая фильтрует данные из базы данных SQL Server на основе данных в базе данных Access. Каков наилучший способ сделать это с помощью ADO.NET?Перекрестная ссылка на несколько баз данных

Могу ли я извлечь требуемые данные из каждой базы данных в две новые таблицы. Поместите их в один набор данных. Затем выполните другую команду SELECT в наборе данных для объединения данных?

Дополнительная информация: База данных Access не является постоянной. Файл доступа, который будет использоваться, устанавливается пользователем во время выполнения.

Вот немного справочной информации, чтобы объяснить, почему существуют две базы данных. Моя компания использует CAD-программу для проектирования зданий. В программе хранятся материалы, используемые в модели САПР в базе данных Access. Для каждой модели есть один файл. Я пишу программу, которая будет генерировать информацию о стоимости для каждой модели. Это основано на текущих ценах материалов, хранящихся в базе данных SQL Server.


мое решение

Я в конечном итоге просто импортировать данные в БД доступа во временную таблицу в БД SQL сервера. Выполняя всю необходимую обработку, удалив временную таблицу. Это было не очень красивое решение, но оно сработало.

ответ

3

Вы не хотите, чтобы тянуть оба набора данных через, если вы не должны делать это. У вас также будет проблема с решением Tomalak, поскольку местоположение файла может измениться и даже не будет доступно для самого сервера.

Я полагаю, что ваши пользователи настроили базу данных Access с людьми/продуктами или тем, что им интересно в работе, и поэтому вам нужно выбрать одну из двух баз данных. В этом случае таблица Access, вероятно, меньше, чем таблица (ы) SQL Server. Лучше всего использовать данные Access, а затем использовать это для создания отфильтрованного запроса на SQL Server, чтобы можно было минимизировать данные, отправляемые по сети.

Итак, самые важные вещи:

  1. Фильтр данных на сервере, так что вы можете свести к минимуму сетевой трафик, а также потому, что база данных будет быстрее при фильтрации, чем ADO.NET
  2. Если вам нужно выбрать набор данных для вложения в ваше приложение, потяните меньший набор данных, а затем используйте его для фильтрации другой таблицы.
+0

Согласовано. Поскольку на каждом клиенте имеется база данных Access, представляется необоснованным настраивать множество «временных» связанных серверов. – neonski 2008-10-27 15:02:24

0

Сначала вам нужно что-то сделать на сервере - укажите БД доступа как «Связанный сервер».

Тогда вы сможете запросить его из SQL-сервера, вытаскивая или заполняя данные, как вам нравится. Эта веб-страница дает хороший обзор о том, как это сделать.

http://blogs.meetandplay.com/WTilton/archive/2005/04/22/318.aspx

0

Вы пробовали бенчмаркинг, что произойдет, если вы свяжетесь с интерфейсом Access до вашего SQL Server через ODBC и напишите свой SQL, как если бы обе таблицы были локальными? Затем вы можете сделать трассировку на сервере, чтобы точно увидеть, что Jet отправляет на сервер. Вы можете быть удивлены, насколько эффективен Jet с такими вещами. Если вы связываете ключевое поле (например,, и поле ID, независимо от того, из SQL Server или нет), скорее всего, Jet отправит список идентификаторов. Или вы можете написать свой SQL, чтобы сделать это таким образом (используя IN SELECT ... в вашем предложении WHERE).

В принципе, насколько эффективны будут вещи, зависит от того, где будет выполняться ваше предложение WHERE. Если, например, вы присоединяетесь к локальной таблице Jet со связанной таблицей SQL Server в одном поле и фильтруете результаты на основе значений в локальной таблице, это, скорее всего, будет чрезвычайно эффективным, поскольку единственное, что Jet будет отправлять на сервер все, что необходимо для фильтрации таблицы SQL Server.

Опять же, это будет полностью зависеть от того, что вы пытаетесь сделать (то есть, какие поля вы фильтруете). Но дайте Джет шанс увидеть, если он умный, в отличие от того, чтобы сесть на летучую мышь, что Jet ее испортит. Для корректной работы Jet может потребоваться некоторая настройка, чтобы заставить Jet работать эффективно, но если вы можете сохранить свою логическую клиентскую сторону, вам будет лучше, чем пытаться обмануть, отслеживая все базы данных Access с сервера.

0

Если я правильно прочитал вопрос, вы НЕ пытаетесь перекрестно ссылаться на несколько баз данных.

Вам нужно просто ссылаться на сведения о конкретном файле, который в данном случае, может содержать:

первичный ключ, родительский файл контрольной суммы (если это модификация), контрольная сумма файла, последний известный автор, номер ревизии , дата последнего изменения ...

А затем этот первичный ключ при добавлении информации, полученной при анализе этого файла с помощью вашей программы.

Если вам действительно нужна распределенная база данных, возможно, вы предпочли бы использовать нереляционную базу данных, такую ​​как LDAP.

Если вы не можете использовать LDAP, но должны использовать реляционную базу данных, вы можете использовать GUID для обеспечения того, чтобы ваши первичные ключи были хорошими.

0

Поскольку вы не даете достаточно информации, мне нужно будет сделать некоторые предположения.

Предполагая:

  1. SQL-сервера и базы данных Access не на том же компьютере
  2. SQL-сервер не может видеть базу данных Access через общий файловый или это будет слишком сложно для достижения этой цели.
  3. Вам не нужно делать соединение между базой данными доступа и сервером SQL, только использовать данные из ТЕХ доступа к базе данных в качестве подстановки элементов ваших, где положение

Если вышеуказанные предположения верны, то вы можете просто используйте ADO, чтобы открыть базу данных Access и получить нужные данные, возможно, в наборе данных или в формате datatable. Затем извлеките нужные данные и отправьте их на другой запрос ADO на ваш SQL Server в динамическом предложение Where, подготовленный оператор или через параметры в хранимую процедуру.

Другие решения, которые люди дают, предполагают, что вам нужно делать соединения с вашими данными или иным образом выполнять SQL, который включает обе базы данных. Для этого вам необходимо использовать связанные базы данных или импортировать данные в таблицу (возможно, временную).

1

Предполагая, что сервер Sql может получить доступ к базам данных Access, вы можете построить запрос OPENROWSET через них.

SELECT a.* 
FROM SqlTable 
JOIN OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0', 
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'', 
    Orders 
) as b ON 
    a.Id = b.Id 

Вы просто измените путь к базе данных Access во время выполнения, чтобы перейти к различным MDB.