Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Соединить таблицы (представления) из двух баз данных (Access и SQL Server) / 18 сообщений из 18, страница 1 из 1
10.12.2006, 11:38
    #34188342
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
Сейчас перевожу приложение с 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
10.12.2006, 13:17
    #34188406
Bigheadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
Средствами ADO.NET это не решается. Решается средствами SQL Server. Создайте в нем Linked Server, смотрящий на БД Access. После этого сможете написать соответствующее представление. Подробнее Books Online и форум по MS SQL.
...
Рейтинг: 0 / 0
10.12.2006, 14:52
    #34188463
Ramin Hashimzade
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
авторСредствами ADO.NET это не решается. Решается средствами SQL Server. Создайте в нем Linked Server, смотрящий на БД Access. После этого сможете написать соответствующее представление. Подробнее Books Online и форум по MS SQL.

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


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

Для данной конкретной задачи я считаю наиболее подходящим то решение, которое я предложил выше. Тянуть все данные на клиента, а потом фильтровать (кстати а зачем здесь фильтр???), считаю неоправданным.
Кстати для связки Access-Access тоже можно реализовать нечто похожее. Только там нет Linked Server, есть некий аналог. К сожалению, не помню как называется.
...
Рейтинг: 0 / 0
11.12.2006, 14:38
    #34190362
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
еще какие-нибудь идеи имеются?
...
Рейтинг: 0 / 0
11.12.2006, 15:31
    #34190574
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
а чем вас не устраивает старое решение с бд, где подключены таблицы из обоих бд?
в случае sql server-а вам уже сказали как это решить?
имхо, это оптимальный путь
потому что если решать это в ADO.NET - значит тянуть это все на клиента, что не оптимально, не кажется?
...
Рейтинг: 0 / 0
11.12.2006, 15:59
    #34190694
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
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
11.12.2006, 16:22
    #34190822
Шайтан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
...
Рейтинг: 0 / 0
11.12.2006, 17:58
    #34191246
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
nibblesт.е. если я укажу "select ID, Name from Table1 where ID IN (10,11,12)", то на клиента будет передано "select * from Table1", так что ли? - нет, конечно

я вот в свете всего вышеизложенного перестал понимать - вам вертикальное нужно слияние таблиц (UNION) или горизонтальное (JOIN)?
nibblesполучить набор записей, представляющий из себя union-соединение - тут вы пишете о union,
а в запросе у вас join?
...
Рейтинг: 0 / 0
11.12.2006, 22:02
    #34191710
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
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
12.12.2006, 10:36
    #34192354
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
тогда, согласитесь, используя механизмы ADO.NET (тот же предложенный вам метод Merge)вам необходимо будет загрузить на клиента как минимум всю таблицу TCustomType и часть таблицы CCustoms... и этот join на клиенте отработает медленнее (имхо), чем на сервере
...
Рейтинг: 0 / 0
12.12.2006, 10:43
    #34192395
Шайтан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
nibblesполучить набор записей, представляющий из себя union-соединение двух таблиц из разных источников данных
nibblesнужен join
ты уж определись, что именно тебе надо :)

если join, то смотри DataSet.Relations ( тут )
согласен с winsky! : тащить всё на клиента - нонсенс
Шайтан
...
Рейтинг: 0 / 0
12.12.2006, 13:25
    #34193098
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
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
12.12.2006, 15:51
    #34193754
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
под сервером я имел в виду бд (будь то access или sql server) - в любом случае ТАМ join отработает быстрее
...
Рейтинг: 0 / 0
13.12.2006, 00:22
    #34195006
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
Первое. Огромная благодарность Шайтану! 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
13.12.2006, 11:04
    #34195676
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
метод 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
26.12.2006, 17:42
    #34225926
nibbles
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
winsky!метод Merge позволит вам сделать подобие join-а без гемора с рилейшинами, вот немного переделанный пример из MSDN-а, который это демонстрирует, извните, что на c# - лень
Стыдно признаться, но я не понял, каким боком этот пример можно прикрутить к решению озвученной проблемы с двумя (тремя и более) реальными таблицами - одной таблицы-справочника и таблицы со вторичным ключем, ссылающимся на первичный ключ первой.
...
Рейтинг: 0 / 0
26.12.2006, 18:34
    #34226055
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединить таблицы (представления) из двух баз данных (Access и SQL Server)
слегка (даже не слегка ;))
погорячился
в случае один-ко-многим join-а мы тут не получим
а жаль :)
уж больно много возни с рилейшинами
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Соединить таблицы (представления) из двух баз данных (Access и SQL Server) / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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