Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785

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

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

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

Помогите, пожалуйста, решить проблему... Вот таким образом я загружаю в пустой 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2019, 05:36
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Вам не нужна вся это адская морока с DataSet'ами, INFORMATION_SCHEMA'ми и прочим низкоуровневым крапом.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 07:37  [ТС]
Usaga, с тем, что вы описали я, честно говоря, совсем не знаком и сейчас времени на то, чтобы с этим разобраться у меня попросту нет, сроки горят. Я всегда работал с базами именно через DataSet'ы. А INFORMATION_SCHEMA и вообще тот код, что я привел здесь, это всё одноразово именно для сохранения набора данных для проекта и последующего его подключения к DataSet. Мне сейчас главное именно вот так одноразово создать точную копию их базы MS SQL в наборе данных .xsd. Все таблицы я перенес (на скрине), а вот остальное как, в частности, ключи? )
Миниатюры
Загрузка базы данных SQL в чистый DataSet со всеми ключами и связями  
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 07:53
Цитата Сообщение от 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
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 08:11  [ТС]
Usaga, спасибо большое! Попробую разобраться сейчас... Если позволите, что-то спрашивать у вас еще, возможно, буду? )
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 08:12
Vinemax, да, я для этого тут и нахожусь. Ну ещё в срачи поввязываться.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 08:13  [ТС]
Ну вот, собственно вопрос... )) А как создать классы из уже имеющихся таблиц SQL Server'а ? Опять же, автоматически, бо таблиц очень много...
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 08:19
Vinemax, если речь о Linq2Db, то у них есть инструкция. Всё сводится к установке NuGet-пакетов специальных с T4 шаблонами, которые и сгенерят все нужные вам классы.

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

Добавлено через 1 минуту
Cгенерированные модели (в случае обеих ORM) могут быть не совсем точными и потребовать небольшого ручного уточнения. Но это ерунда.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 09:07  [ТС]
А какую платформу нужно выбрать для своего приложения, чтобы работала linq2db ? .NET Framework 4.0 ошибку выдает при установке...
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 09:27
Vinemax, .NET Framework 4.5 и выше. Зачем вам .NET Framework 4.0? Ему уже сто лет в обед.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 10:34  [ТС]
Usaga, а не подскажете, как именно сгенерировать класс на основе базы SQL Server ? В LinqToDB.Templates\CopyMe.SqlServer.tt вроде всё подробно, но вот так делаю, а ничего не выходит... Его может быть как-то запускать нужно или что?
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 10:41
Vinemax, почитайте документацию, пожалуйста. Там всё расписано. Я по ней делал когда-то, у меня получилось с первого раза.
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 10:52  [ТС]
Usaga, ну только один подвопросник… Пространство имен на основе базы формируется при компиляции моего проекта после всех настроек?
0
Эксперт .NET
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 11:07
Vinemax, какое пространство имён? О чём речь?
1
 Аватар для Vinemax
149 / 117 / 10
Регистрация: 12.09.2011
Сообщений: 785
17.04.2019, 12:33  [ТС]
Не правильно выразился... ) Я вообще правильно понял, что после выполнения того, что описано в файле 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
 Аватар для Usaga
14291 / 9376 / 1352
Регистрация: 21.01.2016
Сообщений: 35,334
17.04.2019, 13:21
Vinemax, надо:
* создать папку под файлы модели
* создать там пустой файл *.tt (название сами придумайте, главное - расширение)
* скопируйте содержимое CopyMe.SqlServer.tt
* задайте строку подключения внизу файла
* СОХРАНИТЕ его

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

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

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

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

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

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

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

Code
1
2
3
4
    IsCompactColumns              = false;
    IsCompactColumnAliases        = false;
    IncludeDefaultSchema          = false;
    GenerateFindExtensions        = false;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2019, 14:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru