The Digigraphy Ответов: 2

Внутреннее соединение трех таблиц с различными базами данных в C# и отображение в виде таблицы данных


Я хочу объединить три таблицы, которые находятся в разных базах данных, и показать результат в представлении datagrid.

Первая таблица содержит
ID, Group_Id, ваучер, счет, Vendor_Id, сумма

Вторая Таблица Содержит
Group_Id, Group_Name

Третья Таблица Содержит
Vendor_Id, Vendor_Name, Vendor_Address

Я хочу получить такой результат
ID, Group_Name, ваучер, счет, Vendor_Name, Vendor_Address, сумма

И после присоединения я хочу показать эти данные в Datagridview на языке C#

Моя проблема в том, что я могу найти внутреннее соединение только с той же базой данных через интернет. Но Я не могу найти внутреннее соединение таблиц с разными базами данных на одном сервере.

Что я уже пробовал:

str1 = "select `ID`, `Group_ID`, `Voucher_No`, `Bill_No`, `Date`, `Vendor_Id`, `Amount` from BillTable where (Group_ID= ''+ @searchsys + '')";
                cmd1 = new OleDbCommand(str1, cn);

                cmd1.Parameters.Add(new OleDbParameter("@searchsys", Convert.ToString(groupidDBS)));


                cmd1.ExecuteNonQuery();
                da1 = new OleDbDataAdapter(cmd1);
                da1.Fill(dt1);

                OleDbDataReader reader4 = cmd1.ExecuteReader();

2 Ответов

Рейтинг:
2

Maciej Los

[РЕДАКТИРОВАТЬ]

Дигиграфика писала::
Мое местоположение в базе данных первой таблицы - C:\Users\Digi\Source\Soft\BillData.accdb
А во-вторых, расположение базы данных таково:
C:\Users\Digi\Source\Soft\Master\GroupList.accdb

Обе эти базы данных находятся в разных местах. И я хочу присоединиться к ним


У вас есть два способа добиться этого:
1) Создайте одну базу данных и
а) связать все таблицы из всех баз данных
или
б) переместить (импортировать) все таблицы из разных баз данных в одну
Видеть: Импорт или ссылка на данные в другой базе данных Access - Access[^]
Затем используйте этот запрос:
SELECT t1.ID, t2.Group_Name, t1.Voucher, t1.Bill, t3.Vendor_Name, t3.Vendor_Address, t1.Amount
FROM FirstTable t1 
    INNER JOIN SecondTable t2 ON t1.Group_Id = t2.Group_Id
    INNER JOIN ThirdTable t3 ON t1.Vendor_Id = t3.Vendor_Id
--WHERE t1.Group_Id = ?

Я бы переосмыслил использовать этот способ.

2) Использование в статье[^]:
Вам нужно будет изменить тело запроса таким образом:
SELECT t1.ID, t2.Group_Name, t1.Voucher, t1.Bill, t3.Vendor_Name, t3.Vendor_Address, t1.Amount
FROM FirstTable t1 --this database is initial database (defined in connection string)
    INNER JOIN SecondTable IN 'C:\Users\Digi\Source\Soft\Master\GroupList.accdb' t2 ON t1.Group_Id = t2.Group_Id
    INNER JOIN ThirdTable IN 'C:\Users\Digi\Source\Soft\ThirdDatabase.accdb' t3 ON t1.Vendor_Id = t3.Vendor_Id
WHERE t1.Group_Id = ?

Выше также должно работать, но это сложнее.

Итак, измененный код может выглядеть так:
Dim firstFileName As String = "C:\Users\Digi\Source\Soft\BillData.accdb"
Dim secondFileName As String = "C:\Users\Digi\Source\Soft\Master\GroupList.accdb"
Dim thirdFileName As String = "C:\Users\Digi\Source\Soft\Master\ThirdDatabase.accdb"
Dim sConStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};;Persist Security Info=False;", firstFileName)
Dim dt As DataTable = New DataTable()

'1.
Using connection AS OleDbConnection = New OleDbConnection(sConStr)
    Dim sql As String = String.Format("SELECT t1.ID, t2.Group_Name, t1.Voucher, t1.Bill, t3.Vendor_Name, t3.Vendor_Address, t1.Amount{0}FROM FirstTable t1{0}    INNER JOIN SecondTable IN '{1}' t2 ON t1.Group_Id = t2.Group_Id{0}    INNER JOIN ThirdTable IN '{2}' t3 ON t1.Vendor_Id = t3.Vendor_Id{0}WHERE t1.Group_Id = ?", vbCrLf, secondFileName, thirdFileName)
    connection.Open()
    '2.
    Using command As OleDbCommand= New OleDbCommand(sql, connection)
        command.Parameters.Add(New OleDbParameter() With {.OleDbType = OleDbType.VarChar, .Value=2})
        '3.
        Dim reader As OleDbDataReader = command.ExecuteReader()
        '4.
        dt.Load(reader)
    End Using
End Using
'load data into dgv component
DataGridView1.DataSource = dt


Строки подключения доступа - ConnectionStrings.com[^]


The Digigraphy

Привет Maciej Los, в этом запросе как я могу дать подключение к таблице?
Например расположение базы данных первой таблицы отличается от базы данных второй таблицы

Maciej Los

Просто замените "FirstTable", "SecondTable" и "ThirdTable" настоящими именами таблиц.

The Digigraphy

Эй, вообще-то я пытаюсь реализовать его в c#. Я написал следующий код, как вы предлагаете. Но для этого требовалось OleDbConnection для каждой таблицы. Как мне это реализовать?

стр = "выбрать Т1.Код, Т2.Группа, Т1.Voucher_No, Т1.Bill_No, Т1.Дата, Т3.Vendor_Name от BillTable INNERJOIN Имя_группы Т1 Т2 Т1.И group_id = Т2.И group_id VendorList INNERJOIN Т3 на Т1.Vendor_Id = Т3.Vendor_Id ";
da = новый OleDbDataAdapter(str, cn);

Maciej Los

Должна быть только одна связь! Вы должны создать его экземпляр перед созданием DataAdapter.

The Digigraphy

Как использовать одно соединение для разных баз данных?

Maciej Los

Проверьте обновленный ответ.

The Digigraphy

Мое местоположение в базе данных первой таблицы - C:\Users\Digi\Source\Soft\BillData.accdb
А во-вторых, расположение базы данных таково:
C:\Users\Digi\Source\Soft\Master\GroupList.accdb

Обе эти базы данных находятся в разных местах. И я хочу присоединиться к ним

Maciej Los

См. обновленный ответ.

The Digigraphy

Здравствуйте, Мацей, Спасибо за Вашу помощь. Теперь я получаю синтаксическую ошибку в предложении FROM

The Digigraphy

До сих пор я пытался это сделать

DataTable dt = новый DataTable();
DataSet ds = новый набор данных();

ДС.столы.Добавить(dt);

строка masterlocation = @"C:\Users\PC\source\repos\Soft\bin\Debug\MasterList.accdb";
строка datalocation = @"C:\Users\PC\source\repos\Soft\bin\Debug\billdatabse.accdb";
string scontr = строка.Формат("Поставщик=Майкрософт.Туз.Oledb для.12.0;Источник данных={0};;сохранять сведения о безопасности=false; в", datalocation);

OleDbConnection connection = новый OleDbConnection(scontr);

string str = строка.Формат("выберите.ИД, б.Группа, в себя.Voucher_No, а.Bill_No, а.Дата, гр.Vendor_Name, а.Сумма от (BillTable как внутреннее соединение Имя_группы в '{1}' Б на.И group_id = б.И group_id) внутреннее соединение VendorList в '{1}' C на.Vendor_Id = гр.Vendor_Id ", datalocation, masterlocation);

соединение.Открыть();
OleDbCommand command = new OleDbCommand(str, соединение);

OleDbDataReader reader = команда.Метода executereader();

dt.Load(считыватель);

DataGridView1.Источник данных = ДТ.DefaultView;

Все еще получаю ту же ошибку

*Я сделал несколько изменений в базе данных и сделал 3 базы данных до 2, 1-для всех счетов и других для MasterList

Maciej Los

Как я уже упоминал в своем ответе. Вы должны использовать первый метод (все таблицы в одной базе данных).

Рейтинг:
0

CHill60

Вы пометили это как доступ, но ссылаетесь на

Цитата:
разные базы данных на одном сервере.
поэтому я собираюсь предположить, что это какой-то SQL.

Вы можете обратиться к таблице, подключившись к определенной базе данных и просто используя ее имя, например
select [ID] from Table1
но вы также можете дать ему его "полное имя" - включая имя базы данных и имя схемы, например
select [ID] from [database2].[dbo].Table1
Если ты являются используя Access и таблицу в другом файле .accdb, затем используйте связанные таблицы (intro здесь[^- но не звоните в службу!)

EDIT - also - избегайте атак SQL-инъекций (см. SQL-инъекции | фонд[^] ) с помощью параметризованных запросов (см. Объект oledbcommand.Свойство Параметров (System.Data.OleDb) | Microsoft Docs[^] )


Maciej Los

5ed!

The Digigraphy

Привет @CHill60. Извините, что создаю путаницу. Это база данных доступа/

CHill60

В этом случае я бы лично использовал связанные таблицы - таким образом, они будут "выглядеть" так, как будто находятся в одном файле