Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40

DataTable, DataAdapter, SQLCommanBuilder на службе обмена данными между базами

18.01.2019, 11:12. Показов 1089. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго всем, кто зашел сюда!
Продолжаю курить мануалы MSDN и чем дальше тем забористее получается. В голове уже каша сварилась, нужен свежий и трезвый взгляд.
Вопрос не подразумевает ответа в виде кода готовой функции, сами понимаете в чужом коде сложно разбираться, ожидаю получить совета, перенять опыт.
К сути:
Есть источник данных - допустим Оракл.
С помощью нехитрого
C#
1
oracleDataTable.Load(oracleDataReader);
получаем вполне жизнеспособную таблицу с заголовками, типами данных DataColumn и параметрами макс.длины текстового поля, полей рандомное кол-во, заранее неизвестно.

...

Есть целевой источник данных - допустим MS SQL.
соответственно connectionString, sqlDataAdapter("SELECT * from SQLTable", connectionString), sqlDataTable, SqlCommandBuilder(sqlDataAdapter).
Опустим проверку на существование таблицы в целевом источнике и его /sqlAdapter.Update(sqlDataTable)/, т.к. SQLTable скорее не существует.

Цель: из DataTable oracleDataTable получить SQLTable в БД SQL.

Безусловно можно повозиться и создать целевую таблицу в виде кода T-SQL, с помощью SSMS, но считаю что "все должно быть одной кнопкой"... и без участия SQL-программиста.

oracleDataTable и sqlDataTable очевидно члены одного класса DataTable, соответственно типы данных в DataColumn в одной знаменательной плоскости, что по идее не должно привести к неиллюзорным траблам.
C#
1
2
3
4
5
6
Caption: ID_REGION      DataType: System.Decimal        Length: -1
Caption: NAME_REGION      DataType: System.String Length: 80
Caption: ID_CITY        DataType: System.Decimal        Length: -1
Caption: NAME_CITY        DataType: System.String Length: 80
Caption: GEOX   DataType: System.String Length: 4
Caption: GEOY   DataType: System.String Length: 4
Единственное что в голову приходит это
C#
1
2
3
4
foreach (DataColumn item in dataTable.Columns)
                {
                    //Какойто SQL-генератор для генерации CREATE TABLE...
                }
или я всё-таки что-то упускаю?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2019, 11:12
Ответы с готовыми решениями:

Обмен данными между базами (синхронизация)
Раньше была одна база которая хранила список товаров с ценами и заказы. Стала задачи в разделении базы на серверную (одну, которая хранит...

Обмен данными между базами в режиме реального времени
Всем доброго времени суток!! В SQL новичок, нужна информация по следующему вопросу. Есть 2 БД на одном сервере MS SQL Server 2005,...

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

2
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
18.01.2019, 22:17
Цитата Сообщение от judipav Посмотреть сообщение
или я всё-таки что-то упускаю?
Если без промежуточной прослойки в виде вашего приложения, то теоретически можно это сделать используя всего пару sql комманд.
1. Создать linked server указывающий на oracle database (используя OLEDB Provider как источник данных).
2. Запросом CREATE TABLE AS SELECT * FROM OPENQUERY(...) зачитать данные из этого linked server-а и создать таблицу соответствующей структуры.

С конвертацией типов данных могут быть нюансы (иногда непреодолимые).
0
1 / 1 / 0
Регистрация: 14.09.2018
Сообщений: 40
18.01.2019, 23:20  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Если без промежуточной прослойки в виде вашего приложения
Я понимаю что можно прикрутить LS, но прослойка нужна, в процессе данные модифицируются кучей API-вызовов + уже существует внешний task-sheduler на отдельные функции с клиентской приложухой.
Свежая голова мне дала подсказку в виде
C#
1
2
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (table.State != SqlSmoState.Existing)
                {
                    foreach (DataColumn dc in dataTable.Columns)
                    {
                        Column c = new Column();
                        c = new Column(table, dc.ColumnName);
                        c.DataType = GetDataType(dc);               ///// реализация ниже
                        if (dc.AutoIncrement)
                        {
                            c.Identity = true;
                            c.IdentityIncrement = dc.AutoIncrementStep;
                            c.IdentitySeed = dc.AutoIncrementSeed;
                        }
                        table.Columns.Add(c);
                    }
                    table.Create();
                }
и
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public DataType GetDataType(DataColumn dataColumn)
        {
            DataType dt = null;
 
            switch (dataColumn.DataType.ToString())
            {
                case ("System.Decimal"):
                    dt = DataType.Decimal(10, 3);
                    break;
                case ("System.String"):
                    dt = DataType.VarChar(dataColumn.MaxLength);
                    break;
                case ("System.Int32"):
                    dt = DataType.Int;
                    break;
            }
            return dt;
        }
пока с пылу с жару, отладчиком гоняю

Добавлено через 15 минут
Цитата Сообщение от judipav Посмотреть сообщение
DataType.Decimal(10, 3);
DataType.Decimal(3, 10);
безусловно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2019, 23:20
Помогаю со студенческими работами здесь

Протокол обмена данными между клиентом и сервером
Есть сервер, есть клиент, оба асинхорнные. Работают стабильно. Но гоняют только байты между друг другом, которые перекодируются в ASCII, но...

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

Защита обмена данными между программными комплексами
Доброго времени суток, форумчане!) Есть следующая типичная проблема. Программа может принимать сообщения определенного неофишируемого...

Программа обмена данными между двумя файлами
8. Разработать программу обмена данными между двумя файлами. Имена файлов вводятся с клавиатуры. помогите плз сделать

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru