powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
18 сообщений из 18, страница 1 из 1
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34188342
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас перевожу приложение с VB6 на VB.NET.

Встала задача в приложении-клиенте с помощью ADO.NET получить набор записей, представляющий из себя union-соединение двух таблиц из разных источников данных (пока - Access + Access, но в дальнейшем придется поддерживать Access + SQL Server).

Допустим, если б данные находились в одной БД, то запрос выглядел бы следующим образом:
Код: plaintext
1.
2.
3.
SELECT C.*, T.CustomTypeName
FROM CCustoms AS C 
INNER JOIN TCustomType AS T ON C.CustomTypeID = T.CustomTypeID
WHERE C.CustDate > '20050101'

но таблицы CCustoms и TCustomType находятся в разных БД. Как этого добиться на ADO.NET?

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

P.S. Поискал в форуме подобные темы - предлагали метод relation - но с какого боку его прикрутить?
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34188406
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Средствами ADO.NET это не решается. Решается средствами SQL Server. Создайте в нем Linked Server, смотрящий на БД Access. После этого сможете написать соответствующее представление. Подробнее Books Online и форум по MS SQL.
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34188463
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСредствами ADO.NET это не решается. Решается средствами SQL Server. Создайте в нем Linked Server, смотрящий на БД Access. После этого сможете написать соответствующее представление. Подробнее Books Online и форум по MS SQL.

а почему вы не посмоветовали ему метод, который часто здес советуети?! (+ который можно считать изврашением) :)
тоесть всех на один дататабле потом филтер :) потом что то ешё! хмммм...


----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34188472
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Ramin.
Можно хотя бы пару ссылок на мои посты, где я бы советовал этот способ для аналогичных задач.

Для данной конкретной задачи я считаю наиболее подходящим то решение, которое я предложил выше. Тянуть все данные на клиента, а потом фильтровать (кстати а зачем здесь фильтр???), считаю неоправданным.
Кстати для связки Access-Access тоже можно реализовать нечто похожее. Только там нет Linked Server, есть некий аналог. К сожалению, не помню как называется.
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34190362
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще какие-нибудь идеи имеются?
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34190574
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем вас не устраивает старое решение с бд, где подключены таблицы из обоих бд?
в случае sql server-а вам уже сказали как это решить?
имхо, это оптимальный путь
потому что если решать это в ADO.NET - значит тянуть это все на клиента, что не оптимально, не кажется?
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34190694
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!а чем вас не устраивает старое решение с бд, где подключены таблицы из обоих бд?
Меня, честно говоря, и VB6 пока вполне устраивает по сравнению с VB.NET - переписыванием я занялся в рамках изучения этого зверя - .NET. А у "старого решения с БД", кстати, есть свои недостатки.

winsky!в случае sql server-а вам уже сказали как это решить?
В случае с SQL Server (если обе базы данных находятся на нем) это будет решаться не linkedserver, т.к. базы будут лежать на одном серваке.

winsky!потому что если решать это в ADO.NET - значит тянуть это все на клиента, что не оптимально, не кажется?
не понял... :-O
т.е. если я укажу "select ID, Name from Table1 where ID IN (10,11,12)", то на клиента будет передано "select * from Table1", так что ли?
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34190822
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34191246
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nibblesт.е. если я укажу "select ID, Name from Table1 where ID IN (10,11,12)", то на клиента будет передано "select * from Table1", так что ли? - нет, конечно

я вот в свете всего вышеизложенного перестал понимать - вам вертикальное нужно слияние таблиц (UNION) или горизонтальное (JOIN)?
nibblesполучить набор записей, представляющий из себя union-соединение - тут вы пишете о union,
а в запросе у вас join?
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34191710
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky! nibblesт.е. если я укажу "select ID, Name from Table1 where ID IN (10,11,12)", то на клиента будет передано "select * from Table1", так что ли? - нет, конечно

я вот в свете всего вышеизложенного перестал понимать - вам вертикальное нужно слияние таблиц (UNION) или горизонтальное (JOIN)?
nibblesполучить набор записей, представляющий из себя union-соединение - тут вы пишете о union,
а в запросе у вас join?

нужен join
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34192354
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда, согласитесь, используя механизмы ADO.NET (тот же предложенный вам метод Merge)вам необходимо будет загрузить на клиента как минимум всю таблицу TCustomType и часть таблицы CCustoms... и этот join на клиенте отработает медленнее (имхо), чем на сервере
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34192395
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nibblesполучить набор записей, представляющий из себя union-соединение двух таблиц из разных источников данных
nibblesнужен join
ты уж определись, что именно тебе надо :)

если join, то смотри DataSet.Relations ( тут )
согласен с winsky! : тащить всё на клиента - нонсенс
Шайтан
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34193098
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!тогда, согласитесь, используя механизмы ADO.NET (тот же предложенный вам метод Merge)вам необходимо будет загрузить на клиента как минимум всю таблицу TCustomType и часть таблицы CCustoms... и этот join на клиенте отработает медленнее (имхо), чем на сервере

сервера нет, есть две базы данных Access, которые лежат на сетевом ресурсе. "Вся таблица TCustomType" - это 15 записей. Две базы на одном SQL-сервере - это перспектива, которая к сегодняшней реальности никакого отношения не имеет )))

Шайтан nibblesполучить набор записей, представляющий из себя union-соединение двух таблиц из разных источников данных
nibblesнужен join
ты уж определись, что именно тебе надо :)

про union я погорячился-описАлся... нужен (и с самого начала был нужен) - join. В следующий раз в этом топике увидите "union" - можете смело менять на "join" ))

Шайтанесли join, то смотри DataSet.Relations ( тут )
согласен с winsky! : тащить всё на клиента - нонсенс
Шайтан
нууу, батенька... это зависит от задачи, согласитесь
тащить на клиента все равно придется - другого выхода при текущей конфигурации нет: есть таблица с заказами (типовая выборка для клиента содержит около 100-200 записей) и есть таблица-справочник (вся таблица - 15 записей). Соединить join'ом эти две таблицы на клиенте - это ж сам бог велел! :))

За подсказку спасибо - посмотрю вечером дома (занимаюсь этой задачей во внерабочее время)
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34193754
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
под сервером я имел в виду бд (будь то access или sql server) - в любом случае ТАМ join отработает быстрее
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34195006
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое. Огромная благодарность Шайтану! Relation - как раз то, что было нужно. Я таки шел верным путем )))
Второе. Хотелось бы услышать предложения по оптимизации этого венегрета (на будущее, а сейчас на реальных моих данных он срабатывает за секунду).
Третье - и такая мысль уже проскальзывала на форуме - позволяет ли DataSet (раз уж это фактически представление базы данных на компе клиента) выполнять запросы select "внутри себя" на имеющихся у него таблицах не дергая сервер?
Ну и четвертое - как через адаптер "доливать" данные в таблицу в DataSet'e? Киньте ссылочку на пример. (тут, наверно, понадобится злополучный merge, да? ))))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
        Dim ds As DataSet

        ' Первая таблица - из первой базы данных
        Dim cnnCust As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=Q:\tmcustom.mdb")
        Dim adpCust As OleDbDataAdapter = New OleDbDataAdapter()
        adpCust.TableMappings.Add("Table", "Order")
        cnnCust.Open()
        ' Игнорировать предварительные расчеты
        Dim cmdCust As OleDbCommand = New OleDbCommand("SELECT CustomID, Customer,CustNum," _
& "CustDate, CustomTypeID, ModeID, Operator, ChangePrice FROM CCustoms " _
& "where CustDate > #01/12/2006# AND ModeID <> 0", cnnCust)
        cmdCust.CommandType = CommandType.Text
        adpCust.SelectCommand = cmdCust
        ds = New DataSet("myResultDataSet")
        adpCust.Fill(ds)
        cnnCust.Close()


        ' Вторая таблица - из другой базы данных (справочник)
        Dim cnnGuid As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=Q:\tmguides.mdb")
        Dim adpGuid As OleDbDataAdapter = New OleDbDataAdapter()
        adpGuid.TableMappings.Add("Table", "OrderType")
        cnnGuid.Open()
        Dim cmdGuid As OleDbCommand = New OleDbCommand("SELECT * FROM TCustomTypes", cnnGuid)
        cmdGuid.CommandType = CommandType.Text
        adpGuid.SelectCommand = cmdGuid
        adpGuid.Fill(ds)
        cnnCuid.Close()

        ' Обеспечить связь
        Dim dr As DataRelation
        Dim dcChild As DataColumn
        Dim dcParent As DataColumn

        dcChild = ds.Tables("Order").Columns("CustomTypeID")
        dcParent = ds.Tables("OrderType").Columns("CustomTypeID")
        dr = New System.Data.DataRelation("ccustoms2types", dcParent, dcChild)
        ds.Relations.Add(dr)

        Dim myRow As DataRow
        Dim myParentRow As DataRow
        ' Получить результат - пробежаться по строчкам таблицы
        For Each myRow In ds.Tables("Order").Rows
            ' Получить строку в таблице-справочнике
            myParentRow = myRow.GetParentRow("ccustoms2types")
            ' Вместе с главной таблицей вывести значение поля из связанной
            Console.WriteLine(myRow("CustomID") _
                & vbTab & myRow("CustomTypeID") _
                & vbTab & myParentRow("CustomTypeName"))
        Next
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34195676
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
метод Merge позволит вам сделать подобие join-а без гемора с рилейшинами, вот немного переделанный пример из MSDN-а, который это демонстрирует, извните, что на c# - лень писать на VB, я думаю, разберетесь(на форме должен быть dataGridView c именем dataGridView1):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
private void Form1_Load(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            DataTable table1 = new DataTable();
            ds.Tables.Add(table1);
            table1.Columns.Add("id", typeof(int));
            table1.Columns.Add("item", typeof(int));
            DataColumn[] key = new DataColumn[1];
            key[0] = table1.Columns["id"];
            table1.PrimaryKey = key;
            for (int c = 1; c <= 10; c++)
            {
                DataRow row = table1.NewRow();
                row[0] = c;
                row[1] = c;
                table1.Rows.Add(row);

            }
            ds.AcceptChanges();
            DataTable table2 = table1.Clone();
            table2.Columns.Add("item2", typeof(int));
            table2.Columns.Remove("item");
            for (int c = 11; c <= 20; c++)
            {
                DataRow row = table2.NewRow();
                row[0] = c-10;
                row[1] = c;
                table2.Rows.Add(row);
            }
          
            ds.Merge(table2);
            dataGridView1.DataSource = ds.Tables[0];

        }
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34225926
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
winsky!метод Merge позволит вам сделать подобие join-а без гемора с рилейшинами, вот немного переделанный пример из MSDN-а, который это демонстрирует, извните, что на c# - лень
Стыдно признаться, но я не понял, каким боком этот пример можно прикрутить к решению озвученной проблемы с двумя (тремя и более) реальными таблицами - одной таблицы-справочника и таблицы со вторичным ключем, ссылающимся на первичный ключ первой.
...
Рейтинг: 0 / 0
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
    #34226055
winsky!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слегка (даже не слегка ;))
погорячился
в случае один-ко-многим join-а мы тут не получим
а жаль :)
уж больно много возни с рилейшинами
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]