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

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

18.01.2019, 11:12. Показов 1116. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru