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

Копирование структуры и данных одной таблицы в другую

24.03.2012, 08:52. Показов 5704. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, возник вопрос при копировании таблицы из БД сервера в таблицу локальной БД. Клиент-серверное приложение.

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
35
36
37
//Адаптер для таблицы БД сервера
private RateOfExchangeTableAdapter STA =
            new RateOfExchangeTableAdapter();
 
//DataSet для таблицы БД сервера
private ServDataBase SDT = new ServDataBase();
 
//Адаптер для таблицы локальной БД
private LocalRateOfExchangeTableAdapter LTA =
             new LocalRateOfExchangeTableAdapter();
 
//DataSet для таблицы локальной БД
private LocalDataBaseDataSet LDT =
            new LocalDataBaseDataSet();
 
//System.Data.DataSet           
DataTable LDS = new DataTable();
 
//DataView для таблицы БД сервера
 
public DataView RateOfExchangeDataView
        {
            get
            {
                return SDT.RateOfExchange.DefaultView;
            }
        }
 
//DataView для таблицы локальной БД
 
public DataView LocalRateOfExchangeDataView
    {
        get
        {
            return LDT.LocalRateOfExchange.DefaultView;
        }
    }
Но попытка сохранить данные следующим образом оканчивается неудачно:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void CopyButton_Click(object sender, RoutedEventArgs e)
    {
        //Копирую структуру и данные в System.Data.DataSet 
       //(делаю снимок загруженной таблицы БД сервера)
        LDS = SDT.RateOfExchange.Copy();
 
        //Объединяю одну таблицу с другой
        LDT.LocalRateOfExchange.Merge(LDS);
 
        //Пытаюсь заполнить локальную таблицу данными из LDT, но она оказывается пуста
        LTA.Fill(LDT.LocalRateOfExchange);
 
        this.DataContext = this;
 
        Console.WriteLine();
    }
Подскажите пожалуйста, как исправить данную неудачу и возможно ли это сделать выше предложенным способом? Надеюсь ответ на вопрос будет полезен многим людям, которым придется заниматься подобными вещами. Заранее спасибо! Если нужно что-то подробнее расписать - дайте знать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.03.2012, 08:52
Ответы с готовыми решениями:

Копирование данных из одной таблицы в другую в SQL
Здравствуйте. Проблема в следующем - нужно скопировать БЕЗ ПОВТОРЕНИЙ поле Код_абитуриента (таблица Абитуриенты) в таблицу...

Копирование данных из одной таблицы в другую в пределах одной базы. Не работает счетчик
Делаю копирование данных из одной таблицы в другую в пределах одной базы. procedure TForm16.Button2Click(Sender: TObject); var ...

Копирование данных из одной таблицы в другую
Есть два файла с разными таблицами, надо по номеру из 3-го столбца в одной таблице найти и скопировать данные из другой. Как в примере в...

8
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
24.03.2012, 09:35
Что такое "локальная БД"?

Цитата Сообщение от Alexcnt Посмотреть сообщение
//Пытаюсь заполнить локальную таблицу данными из LDT, но она оказывается пуста LTA.Fill(LDT.LocalRateOfExchange);
DataAdapter.Fill загружает данные в передаваемый параметр, а не из него.

Правильно ли я понимаю, что в оконном приложении идёт обращение к консоли?
C#
1
2
3
4
5
private void CopyButton_Click(object sender, RoutedEventArgs e)
{
....
    Console.WriteLine();
}
0
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
24.03.2012, 10:35  [ТС]
Локальной БД называю *.sdf файл, который добавляю к проекту VS2010 командой Add -> New Item -> Data -> Local Database. Автоматически создается файл *.xsd, содержащий XML Schema, в который добавляю таблицу. По аналогии делаю тоже самое с БД сервера (пока она находится на локальной машине, но Connection String настроен на SQL Server, а не к файлу *.sdf, как это происходит с локальной БД).

C#
1
Console.WriteLine();
Эту инструкцию принимать во внимание не стоит, она была нужна для того, чтобы просто поставить на нее брейкпойнт и посмотреть результат предыдущей операции, для удобства.

Добавлено через 9 минут
Вот весь код. Отдельно с локальной/серверной БД операции Fill/Update работают замечательно, так как надо, но можно ли скопировать информацию из одной таблицу в другую, используя методы Copy/Merge (или еще какие) остается непонятным..

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
using System.Data;
using WPFDataBinding.ServDataBaseTableAdapters;
using WPFDataBinding.LocalDataBaseDataSetTableAdapters;
 
using System.Xml.Linq;
using System.Data.SqlClient;
 
namespace WPFDataBinding
{
    public partial class MainWindow : Window
    {
 
        private RateOfExchangeTableAdapter STA =
            new RateOfExchangeTableAdapter();
 
        private ServDataBase SDT =
            new ServDataBase();
 
        private LocalRateOfExchangeTableAdapter LTA =
             new LocalRateOfExchangeTableAdapter();
 
        private LocalDataBaseDataSet LDT =
            new LocalDataBaseDataSet();
 
        DataTable LDS = new DataTable();
 
        public DataView RateOfExchangeDataView
        {
            get
            {
                return SDT.RateOfExchange.DefaultView;
            }
        }
 
        public DataView LocalRateOfExchangeDataView
        {
            get
            {
                return LDT.LocalRateOfExchange.DefaultView;
            }
        }
 
        public MainWindow()
        {
            
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
        }
 
 
        private void SaveInServDataBase_Click(object sender, RoutedEventArgs e)
        {
            STA.Update(SDT);
        }
 
        private void SaveInLocalDataBaseButton_Click(object sender, RoutedEventArgs e)
        {
            LTA.Update(LDT);
            //LDT.LocalRateOfExchange.AcceptChanges();
        }
 
 
        private void CopyButton_Click(object sender, RoutedEventArgs e)
        {
            LDS = SDT.RateOfExchange.Copy();
            LDT.LocalRateOfExchange.Merge(LDS);
        }
 
        private void LoadFromLocalDataBaseButton_Click(object sender, RoutedEventArgs e)
        {
            dataGrid2.Visibility = Visibility.Visible;
 
            LTA.Fill(LDT.LocalRateOfExchange);
            this.DataContext = this;
        }
 
        private void LoadFromServerDataBaseButton_Click(object sender, RoutedEventArgs e)
        {
            dataGrid1.Visibility = Visibility.Visible;
 
            STA.Fill(SDT.RateOfExchange);
            this.DataContext = this;
        }
 
    }
}
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.03.2012, 11:30
а что мешает написать команду инсерт и пройдясь по строчкам нужной таблицы DataSet сервера загрузить каждую в таблицу локальной БД?
0
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
24.03.2012, 13:45  [ТС]
Ничего не мешает, но пока не разобрался как это сделать. Возможно я пошел вообще по неправильному пути, используя адаптеры таблиц, хотя инструмент очень удобен, вот только связать 2 таблицы не могу. Общая идея следующая: нужно загрузить данные с БД сервера в элемент управления DataGrid, произвести изменения, а после нажатия на кнопку "Сохранить изменения в локальной БД" сделать как бы снимок этой загруженной измененной таблицы и соответствующее сохранение. При следующем старте программы пользователь мог бы загружать данные не с сервера а с локальной БД. Если не сложно - подскажите как это сделать с использованием селектов или других методов, очень хочется разобраться, но технология пока очень сложно дается. PS: проблема висит уже неделю, решения так и не нашел. Можно обсудить по почте небольшое денежное вознаграждение. Вошел в азарт, но зацикливаюсь, кажется, совсем не на том. Направьте на правильное направление, пожалуйста)
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.03.2012, 16:24
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Загружаем данные в DataTable tt и указываем datagridview1.DataSource =tt
private void btSave_Click(object sender, EventArgs e)
{
DataTable dt = datagridview1.DataSource as DataTable; //получили измененные данные
SqlConnection conn = ... ; //к локальной Бд
SqlCommand comm = new SqlCommand("Insert ... values (@par1, @par2 ..)" , conn); //sql для вставки нужных данных в нужную таблицу
comm.Parameters.Add("@par1", SqlDbType.Int); 
... //добавляем все параметры
foreach(DataRow row in dt)
{
comm.Parameters["@par1"].Value = row[0];
...
comm.ExecuteNonQuery();
}
почему не использую адаптер - потому что строки имеют статус Modified и адаптер будет пытаться обновить данные, а не добавить.
1
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
25.03.2012, 00:36  [ТС]
Спасибо за код. Накатал вот так:

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
        private void SaveButton_Click(object sender, RoutedEventArgs e)
        {
            DataTable dt = dataGrid1.DataContext as DataTable;
 
//Открытое подключение к локальной базе данных. 
//Копирую строку из свойств проекта (вкладка Settings)
 
            SqlConnection conn = new SqlConnection("Data Source=|DataDirectory|\\LocalDataBase.sdf");
            
            SqlCommand comm = new SqlCommand
            ("INSERT INTO LocalTable VALUES (@par1, @par2, @par3)", conn); 
       
            comm.Parameters.Add("@par1", SqlDbType.Date);
            comm.Parameters.Add("@par2", SqlDbType.Decimal);
            comm.Parameters.Add("@par3", SqlDbType.Decimal); 
 
//тут возникает NullReferenceException
            foreach(DataRow row in dt.Rows)
            {
            comm.Parameters["@par1"].Value = row[0];
            comm.Parameters["@par2"].Value = row[1];
            comm.Parameters["@par3"].Value = row[2];
            comm.ExecuteNonQuery();
            }
 
        }
Learx, еще не понял где связь с БД сервера, откуда и идет копирование. Код пока не работает.

Добавлено через 31 минуту
Learx, Может просто договоримся, скиньте свою почту! Я бы Вам скинул работающий проект, с тем что есть, подробно бы все расписал. Деньги на яндекс-кошелек или телефон потом бы скинул. Пока Вы единственный человек, кто может помочь мне разобраться с этой проблемой, так что я заинтересован!)Жду ответа.
0
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
25.03.2012, 12:04
Цитата Сообщение от Alexcnt Посмотреть сообщение
Отдельно с локальной/серверной БД операции Fill/Update работают замечательно, так как надо, но можно ли скопировать информацию из одной таблицу в другую, используя методы Copy/Merge (или еще какие) остается непонятным..
Данные можно из без них скопировать. Структуру таблицы вряд ли. Готовых функций делающих это, я не знаю. Можно самому написать нужные CREATE TABLE.
0
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
25.03.2012, 16:59  [ТС]
serg42, может Вы посмотрите код? в теории Вас понял, но реализовать не получается(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2012, 16:59
Помогаю со студенческими работами здесь

Копирование данных из одной таблицы в другую
procedure TForm10.sTreeViewEx1Change(Sender: TObject; Node: TTreeNode); begin if streeviewex1.Selected.SelectedIndex=2 then while...

Копирование данных из одной таблицы в другую
хочу копировать из одной таблицы на другой. Но дает ошибку.. procedure TForm1.Button1Click(Sender: TObject); begin try ...

Копирование данных из одной таблицы в другую.
Доброго всем времени суток. Возникла такая проблема. Есть две таблицы - исходная Сотрудники (Имя, Фамилия, Отчество, должность) и ...

Копирование данных из одной таблицы в другую.
Всем добрый день. Есть задача, суть её состоит в том, что в одной таблице существуют 2 поля, 1-е поле содержит данные, а 2-е поле должно...

копирование данных из одной таблицы в другую
Существует таблица, в ней есть 3 строки, 1 содержит картинку, 2 и 3 текст, нужно что бы при нажатие на таблицу, данные из 2ой строки...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru