Перекрестные ссылки на несколько баз данных - PullRequest
5 голосов
/ 27 октября 2008

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

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

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

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


Мое решение

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

Ответы [ 6 ]

3 голосов
/ 27 октября 2008

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

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

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

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

Предполагая, что Sql Server может получить доступ к базам данных 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.

0 голосов
/ 10 марта 2009

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

Предполагая, что:

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

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

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

0 голосов
/ 06 марта 2009

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

Вам нужно просто сослаться на сведения о конкретном ФАЙЛЕ, которые в этом случае могут содержать:

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

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

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

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

0 голосов
/ 27 октября 2008

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

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

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

0 голосов
/ 27 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...