148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
1

Загрузка базы данных SQL в чистый DataSet со всеми ключами и связями

17.04.2019, 05:36. Показов 4001. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем!

Помогите, пожалуйста, решить проблему... Вот таким образом я загружаю в пустой DataSet все таблицы из базы данных MS SQL:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    DataSet ds = new DataSet("financy");
    DataTable tables = new DataTable();
    DataTable table;
 
    SqlClient.SqlConnection connection = new SqlClient.SqlConnection(@"server=WIN10-HOST\SQLEXPRESS;database=financy;integrated security=true");
 
    connection.Open();
 
    SqlClient.SqlDataAdapter adapter = new SqlClient.SqlDataAdapter("SELECT * FROM INFORMATION_SCHEMA.TABLES", connection);
 
    adapter.Fill(tables);
 
    foreach (DataRow r in tables.Rows)
    {
        adapter = new SqlClient.SqlDataAdapter("SELECT * FROM " + r(2).ToString, connection);
 
        table = new DataTable(r(2).ToString); adapter.Fill(table); ds.Tables.Add(table);
    }
 
    ds.WriteXmlSchema(@"D:\financy.xsd"); connection.Close();
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        Dim ds As New DataSet("financy"), tables As New DataTable, table As DataTable
 
        Dim connection As New SqlClient.SqlConnection("server=WIN10-HOST\SQLEXPRESS;database=financy;integrated security=true")
 
        connection.Open()
 
        Dim adapter As New SqlClient.SqlDataAdapter("SELECT * FROM INFORMATION_SCHEMA.TABLES", connection)
 
        adapter.Fill(tables)
 
        For Each r As DataRow In tables.Rows
 
            adapter = New SqlClient.SqlDataAdapter("SELECT * FROM " & r(2).ToString, connection)
 
            table = New DataTable(r(2).ToString) : adapter.Fill(table) : ds.Tables.Add(table)
 
        Next
 
        ds.WriteXmlSchema("D:\financy.xsd") : connection.Close()
Все таблицы успешно загружаются. Но не загружаются ключи, связи между таблицами. Как это сделать? То есть, сделать так, чтобы в DataSet загрузилась точная копия моей SQL-базы ?

Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2019, 05:36
Ответы с готовыми решениями:

Загрузка базы данных FoxPro в DataSet
Привет всем! Подскажите, пожалуйста, как средствами .NET (C# или VB) загрузить данные в DataSet...

Обновление DataSet при изменение базы данных в SQL Server
В программе есть дата сет который подключен к SQL Server, допустим я в БД добавил хранимую...

Как обновить dataset после изменения структуры базы данных сервере sql
Здравствуйте, пишу приложение на c#. Подключаюсь к базе данных через сервер ms sql. Допустим есть...

Создание базы данных со связями и запросы на выборку
Есть задача создать базу данных. Описание - в спойлере ниже: В компанию поступают письма по...

38
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 06:59 2
Vinemax, для чего это нужно? Какая конечная цель преследуется?
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 07:13  [ТС] 3
Usaga, конечная цель в том, что мне заказали три варианта программы, для MS SQL, для MySQL и для просто локальной однопользовательской работы, будь то SQLite или простое хранение данных посредством DataSet.WriteXml / ReadXml. То есть, суть в том, что вся работа идет с DataSet и его DataTable'ами, а к ним я уже прикручиваю соответствующие СУБД адаптеры. И вот, как я вам вчера писал в предыдущей своей теме, база у них уже готова, и по этой базе их старой программой наработаны тысячи их клиентов. То есть, сейчас мне важно, чтобы DataSet моей программы был точь в точь, как их база, хотя бы по ключам. Вручную искать и ставить ключи, это уйма мороки, там сотни таблиц больших и маленьких у них. Благодаря вашим подсказкам вчера я успешно копирую таблицы, их поля и типы полей MS SQL базы в набор данных моей программы, но вот надо бы еще всё остальное скопировать, если оно там есть. Ключи точно есть, возможно еще связи какие-то...
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 07:24 4
Vinemax, это неправильный подход. Очень.

Не надо тут использовать DataSet'ы. Это просто неудобно. Возьмите Entity Framework 6 (не Core!) или, что ещё лучше, Linq2Db.

У вас будут для каждой таблицы по классу. По этим классам данные ORM будут строить запросы. Причём, диалект языка будет выбираться исходя из того, к какой СУБД вы подключаетесь (и какой провайдер\поставщик используете).

Описание таблиц (классы "моделей") и запросы никак не будут различаться и будут едиными для всех типов СУБД. Трансляция будет производиться силами самих ORM. Внешние (и не очень) ключи будут корректно учитываться.

Вам не нужна вся это адская морока с DataSet'ами, INFORMATION_SCHEMA'ми и прочим низкоуровневым крапом.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 07:37  [ТС] 5
Usaga, с тем, что вы описали я, честно говоря, совсем не знаком и сейчас времени на то, чтобы с этим разобраться у меня попросту нет, сроки горят. Я всегда работал с базами именно через DataSet'ы. А INFORMATION_SCHEMA и вообще тот код, что я привел здесь, это всё одноразово именно для сохранения набора данных для проекта и последующего его подключения к DataSet. Мне сейчас главное именно вот так одноразово создать точную копию их базы MS SQL в наборе данных .xsd. Все таблицы я перенес (на скрине), а вот остальное как, в частности, ключи? )
Миниатюры
Загрузка базы данных SQL в чистый DataSet со всеми ключами и связями  
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 07:53 6
Цитата Сообщение от Vinemax Посмотреть сообщение
честно говоря, совсем не знаком и сейчас времени на то, чтобы с этим разобраться у меня попросту нет, сроки горят.
Вот тут вы очень сильно ошибаетесь. На ручную реализацию универсального механизма работы с базой (и кучи одних и тех же запросов на разных диалектах) вы угробите на ПОРЯДКИ больше времени.

Для EF6 и Linq2Db есть целые генераторы (Database First) моделей, которые по существующей базе вам и контекст сгенерируют и модели (классы-проекции таблиц) и связи между ними нарисуют. Производительность труда просто взлетает до небес.

Если у вас есть время, чтобы такой ерундой заниматься вручную (выгружать метаданные схемы базы, чтобы вручную с ней потом возиться), то у вас есть время, чтобы изучить (в достаточно мере) EF6 или Linq2Db (ещё проще).

Работа с классами, генерация запросов на нужных диалектах, автогенерация модели данных по схеме базы... DataSet'ы рядом не стояли ни по удобству разработки, ни по скорости, ни по надёжности.

Добавлено через 4 минуты
Vinemax, просто примера ради, в этой теме я выкладывал код минимального примера работы с Linq2Db.

Вот он:
Кликните здесь для просмотра всего текста

C#
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
using System;
using System.Linq;
using LinqToDB;
using LinqToDB.Data;
 
namespace Linq2DbCore
{
    class MyContext : DataConnection
    {
        public MyContext() : base(ProviderName.SqlServer, @"server=(local);database=test_db;integrated security=true")
        {
        }
 
        public ITable<UserAccess> UserAccesses => GetTable<UserAccess>();
    }
 
    class UserAccess
    {
        public int Id { get; set; }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            using (var con = new MyContext())
            {
                Console.WriteLine(con.UserAccesses.Count());
            }
 
            Console.Read();
        }
    }
}


Подключение к SQL Server, где одна таблица UserAccess с одной колонкой ID. Обратите внимание, насколько просто. Никаких схем, DataSet'ов, голых SQL-запросов. Смена типа СУБД производится заменой имени поставщика к конструкторе контекста (ProviderName.SqlServer).

Добавлено через 1 минуту
Научить этот кода работать с MySQL просто: нужно заменить ProviderName.SqlServer на ProviderName.MySQL и всё. Больше ничего. Весь код останется тем же.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 08:11  [ТС] 7
Usaga, спасибо большое! Попробую разобраться сейчас... Если позволите, что-то спрашивать у вас еще, возможно, буду? )
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 08:12 8
Vinemax, да, я для этого тут и нахожусь. Ну ещё в срачи поввязываться.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 08:13  [ТС] 9
Ну вот, собственно вопрос... )) А как создать классы из уже имеющихся таблиц SQL Server'а ? Опять же, автоматически, бо таблиц очень много...
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 08:19 10
Vinemax, если речь о Linq2Db, то у них есть инструкция. Всё сводится к установке NuGet-пакетов специальных с T4 шаблонами, которые и сгенерят все нужные вам классы.

У EF 6 есть встроенные в студию мышкотыкательные средства.

Добавлено через 1 минуту
Cгенерированные модели (в случае обеих ORM) могут быть не совсем точными и потребовать небольшого ручного уточнения. Но это ерунда.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 09:07  [ТС] 11
А какую платформу нужно выбрать для своего приложения, чтобы работала linq2db ? .NET Framework 4.0 ошибку выдает при установке...
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 09:27 12
Vinemax, .NET Framework 4.5 и выше. Зачем вам .NET Framework 4.0? Ему уже сто лет в обед.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 10:34  [ТС] 13
Usaga, а не подскажете, как именно сгенерировать класс на основе базы SQL Server ? В LinqToDB.Templates\CopyMe.SqlServer.tt вроде всё подробно, но вот так делаю, а ничего не выходит... Его может быть как-то запускать нужно или что?
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 10:41 14
Vinemax, почитайте документацию, пожалуйста. Там всё расписано. Я по ней делал когда-то, у меня получилось с первого раза.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 10:52  [ТС] 15
Usaga, ну только один подвопросник… Пространство имен на основе базы формируется при компиляции моего проекта после всех настроек?
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 11:07 16
Vinemax, какое пространство имён? О чём речь?
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 12:33  [ТС] 17
Не правильно выразился... ) Я вообще правильно понял, что после выполнения того, что описано в файле CopyMe.SqlServer.tt на выходе получится .cs-файл, соответствующий моей базе данных?

Добавлено через 3 минуты
Я просто из документации не могу понять что нужно, чтобы выполнить / запустить этот скрипт из LinqToDB.Templates… Где должен находиться мой уже отредактированный .tt-файл...

Добавлено через 1 час 16 минут
Usaga, помогите, пожалуйста! С меня могарыч по завершению работы над программой! Не шучу. Суть linq2db я понял. Действительно очень просто. Не понял только самое простое, хоть и документацию перекопал... Установил в свой проект из NuGet собственно linq2db и linq2db.SqlServer... В папке проекта, да и в самой папке packages появилась папка LinqToDB.Templates… В этой папке есть обычный текстовый файл CopyMe.SqlServer.tt, в котором довольно понятно написано что нужно сделать... Мне только не понятно, когда я его отредактировал (вписал ConnectionString к моей базе, поправил файл app.config с ConnectionString моей базы в проекте), дальше что делать, чтобы сформировались классы моей базы? Просто построить проект? Ничего не происходит. Намекните хотя бы, пожалуйста, уже четыре часа мучаюсь, не соображу...
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 13:21 18
Vinemax, надо:
* создать папку под файлы модели
* создать там пустой файл *.tt (название сами придумайте, главное - расширение)
* скопируйте содержимое CopyMe.SqlServer.tt
* задайте строку подключения внизу файла
* СОХРАНИТЕ его

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

Всё, больше ничего не нужно.

В папке LinqToDB.Templates лежать разные темплейты для донастройки процесса генерации. Можно указать не складывать все классы в один файл, а раскидать по разным, к примеру.
1
148 / 116 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 13:28  [ТС] 19
Цитата Сообщение от Usaga Посмотреть сообщение
* создать папку под файлы модели
* создать там пустой файл *.tt (название сами придумайте, главное - расширение)
* скопируйте содержимое CopyMe.SqlServer.tt
* задайте строку подключения внизу файла
* СОХРАНИТЕ его
Вот я всё это и сделал. Или это всё в Студии надо было делать? Как понять, что по сохранению Студия запустит его исполнение?

Добавлено через 1 минуту
Может быть мы с вами сейчас на разных языках говорим... У меня проект на VB...

Добавлено через 1 минуту
Создаст C#, это понятно, то не проблема...
0
Эксперт .NET
12090 / 8369 / 1280
Регистрация: 21.01.2016
Сообщений: 31,548
17.04.2019, 14:17 20
Цитата Сообщение от Vinemax Посмотреть сообщение
Или это всё в Студии надо было делать? Как понять, что по сохранению Студия запустит его исполнение?
Да, это всё в студии делать надо. Она шаблон исполнять начнёт и код по ним генерировать.

Добавлено через 56 секунд
Причём, я не уверен, что у вас всё нормально работать будет, если у вас какая-то лютая древность в виде VS 2010...

Добавлено через 24 минуты
Я ещё рекомендую добавить такие настройки перед строкой подключения, чтобы сгенерированный код почище был:

Код
    IsCompactColumns              = false;
    IsCompactColumnAliases        = false;
    IncludeDefaultSchema          = false;
    GenerateFindExtensions        = false;
1
17.04.2019, 14:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2019, 14:17
Помогаю со студенческими работами здесь

Запрос SQL. Выборка из базы по элементу первого ListBox. Загрузка соответствующих данных - во второй
Имеется 2 листбокса на форме в первом разделы во втором темы раздела. Нужно сделать чтобы при...

Загрузка данных из DataSet в Listview
Осваиваю Sql! Вот пытаюсь загрузить из БД данные в listView, загрузить получилось но загрузилась...

Сохранение базы данных со всеми ссылочными документами
Скорее всего не туда пишут, ну хотя бы укажите куда глядеть Существует база данных в exel Вся...

Загрузка данных из DataSet в таблицу Oracle
Добрый вечер. Пытаюсь загрузить данные из DataSet в таблицу на сервере Oracle, но столкнулся с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru