Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
Alexcnt
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
1

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

24.03.2012, 08:52. Просмотров 3444. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2012, 08:52
Ответы с готовыми решениями:

Копирование данных из одной базы таблице в другую базу таблиц
Задача Насколько реально имея 2 базы с разными таблицами перенести из одной в другую таблицу...

Перенос с одной таблицы в другую данных
Есть бд access в которой есть данные . Нужно перенесли данные с одной таблицы в другую . В шарпе...

Вывод данных из одной таблицы в другую
Не могу создать вывод данных из одной таблицы в другую. То есть заполняем таб1, после чего эти...

INSERT данных из одной таблицы в другую циклом
Здравствуйте друзья. Есть таблица ip_address там хранятся ip адреса которые я програмно пингую...

копирование даных из одной формы в другую разных приложений
народ помогите плз пишу програмку которая получает данние о весе с весов помимо всего чего она...

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

Цитата Сообщение от 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
Alexcnt
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
24.03.2012, 10:35  [ТС] 3
Локальной БД называю *.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
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,498
24.03.2012, 11:30 4
а что мешает написать команду инсерт и пройдясь по строчкам нужной таблицы DataSet сервера загрузить каждую в таблицу локальной БД?
0
24.03.2012, 11:30
Alexcnt
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
24.03.2012, 13:45  [ТС] 5
Ничего не мешает, но пока не разобрался как это сделать. Возможно я пошел вообще по неправильному пути, используя адаптеры таблиц, хотя инструмент очень удобен, вот только связать 2 таблицы не могу. Общая идея следующая: нужно загрузить данные с БД сервера в элемент управления DataGrid, произвести изменения, а после нажатия на кнопку "Сохранить изменения в локальной БД" сделать как бы снимок этой загруженной измененной таблицы и соответствующее сохранение. При следующем старте программы пользователь мог бы загружать данные не с сервера а с локальной БД. Если не сложно - подскажите как это сделать с использованием селектов или других методов, очень хочется разобраться, но технология пока очень сложно дается. PS: проблема висит уже неделю, решения так и не нашел. Можно обсудить по почте небольшое денежное вознаграждение. Вошел в азарт, но зацикливаюсь, кажется, совсем не на том. Направьте на правильное направление, пожалуйста)
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,498
24.03.2012, 16:24 6
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
Alexcnt
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
25.03.2012, 00:36  [ТС] 7
Спасибо за код. Накатал вот так:

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
serg42
121 / 103 / 7
Регистрация: 14.02.2010
Сообщений: 263
25.03.2012, 12:04 8
Цитата Сообщение от Alexcnt Посмотреть сообщение
Отдельно с локальной/серверной БД операции Fill/Update работают замечательно, так как надо, но можно ли скопировать информацию из одной таблицу в другую, используя методы Copy/Merge (или еще какие) остается непонятным..
Данные можно из без них скопировать. Структуру таблицы вряд ли. Готовых функций делающих это, я не знаю. Можно самому написать нужные CREATE TABLE.
0
Alexcnt
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 10
25.03.2012, 16:59  [ТС] 9
serg42, может Вы посмотрите код? в теории Вас понял, но реализовать не получается(
0
25.03.2012, 16:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 16:59

Программное копирование структуры таблицы в Access
Есть ли какая-нибудь sql-инструкция для копирования структуры имеющейся таблицы в Access?...

Перенос строки из одной таблицы в другую
Как перенести строку из одной таблицы в другую по id? а лучше копирование строк по id

Переместить строку из одной таблицы в другую
Всем доброго времени суток. У меня есть таблица (табельный номер, фамилия, имя, отчество, дата...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru