Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перенос данных из XML в БД через Dataset / 20 сообщений из 20, страница 1 из 1
26.03.2015, 05:00
    #38917181
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Добрый день друзья! Стоит задача написать Локальную кассу для удаленных магазинов (в основном все работают через терминал, но часто стала пропадать связь, так что поставили задачу обеспечения работы кассы локально). Сам интерфейс работы кассы уже написал и все работает. Осталось решить задачу синхронизации данных. Вернее полная очистка локальных таблиц лежащих в MDB файле (номенклатура товаров, штрих-коды, скидки, карты и т.п.) и новая загрузка их из полученного xml файла. Не как не могу решить эту казалось бы простую задачу(вернее хочется решить ее красиво, без перечисления всех таблиц и полей).

что-то типа:


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Public Function loadXmlFile(Filename As String) As Boolean
        On Error GoTo er
       
    Dim newDs As New LocalKassaDataSet()
    Dim newTa As New LocalKassaDataSetTableAdapters.TovarTableAdapter

    Dim imp_ds as Dataset()

     imp_ds.ReadXml(Filename)
     newTa.ClearBeforeFill = True
     newTa.Fill(imp_ds.Tables(1)) ' Здесь загружаю пока одну таблицу Tovar в соотв. адаптер

       loadXmlFile=true

ex:
        Exit Function
er:
        MsgBox(Err.Number & Err.Description)
        loadXmlFile = False
        Resume ex
        Resume Next

    End Function



в newTa.Fill(imp_ds.Tables(1)) выходит ошибка

---------------------------
Локальная касса
---------------------------
13 - Не удалось привести тип объекта "System.Data.DataTable" к типу "TovarDataTable".
---------------------------
ОК
---------------------------

Структура таблиц в Базе и XML одинаковая.

З.Ы. Прошу сильно не пинать, но только начал писать на .NET и никак не могу понять смысла
и как использовать DataSet )))

Может вообще не так действовать надо..??
...
Рейтинг: 0 / 0
26.03.2015, 09:05
    #38917279
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Z_Alex,

MSSQL и ORACLE предоставляют широкий набор для работы с XML.
А для загрузки\выгрузки данных лучше использовать BCP.EXE для MSSQL, а для ORACLE SQLLDR.EXE
(если файл данных очень большой, например 80 гб, то с XML вы его вряд ли загрузите :) )
...
Рейтинг: 0 / 0
26.03.2015, 09:06
    #38917282
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Roman Mejtes,

ну еще лучше использовать ETL
...
Рейтинг: 0 / 0
26.03.2015, 09:31
    #38917310
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Я сомневаюсь, что локальная касса наколотит данных на 80 Гб. В случае MSSQL я бы просто использовал ХП, принимающую XML, и внутри разбирающую его через XQuery (или sp_xml_preparedocument/OPENXML - в ряде случаев они работают быстрее).
...
Рейтинг: 0 / 0
26.03.2015, 09:42
    #38917325
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Ну и как бы да, если MSSQL, и позволяет версия(>=2008), лучше использовать табличный тип данных (SqlParameter с типом SqlDbType.Structured вполне принимает в качестве значения DataTable).
Плюс, как вариант, можно посмотреть в сторону SqlXmlBulkLoad .
...
Рейтинг: 0 / 0
26.03.2015, 10:05
    #38917352
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Roman MejtesZ_Alex,

MSSQL и ORACLE предоставляют широкий набор для работы с XML.
А для загрузки\выгрузки данных лучше использовать BCP.EXE для MSSQL, а для ORACLE SQLLDR.EXE
(если файл данных очень большой, например 80 гб, то с XML вы его вряд ли загрузите :) )

Со стороны сервера файл XML итак формируется на MS SQL 2008. Я говорю про то, как его загрузить на локальном компе в базу MS Access
...
Рейтинг: 0 / 0
26.03.2015, 10:09
    #38917360
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
MS SQL 2008 стоит на главном сервере, который ведет складской учет и учет в магазинах. В удаленных магазинах и хотим поставить кассу на .Net + данные хранящиеся в МS ACCESS чтобы только могли делать продажи и потом опять же XML файлом выгружать продажи за день на сервер по FTP или mail
...
Рейтинг: 0 / 0
26.03.2015, 10:37
    #38917396
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Roman Mejtes(если файл данных очень большой, например 80 гб, то с XML вы его вряд ли загрузите :) )
Да хоть терабайт. Ридером читаешь файл, вообще никаких проблем.
...
Рейтинг: 0 / 0
26.03.2015, 11:27
    #38917470
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Z_Alex,

Код: c#
1.
2.
3.
4.
5.
var ds = new DataSet();
ds.ReadXml(xmlFile);
var tds = new MyTypedDataSet();
using(var rd = ds.Tables[0].CreateDataReader())
  tds.Load(rd, LoadOption.OverwriteChanges, tds.MyTypedDataTable);
...
Рейтинг: 0 / 0
27.03.2015, 04:48
    #38918325
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Сон Веры ПавловныZ_Alex,

Код: c#
1.
2.
3.
4.
5.
var ds = new DataSet();
ds.ReadXml(xmlFile);
var tds = new MyTypedDataSet();
using(var rd = ds.Tables[0].CreateDataReader())
  tds.Load(rd, LoadOption.OverwriteChanges, tds.MyTypedDataTable);



Спасибо большое! Это именно то что нужно!
для всех таблиц в Базе получился вот такой маленький код

Код: vbnet
1.
2.
3.
4.
5.
6.
  imp_ds.ReadXml(Filename)
        Dim idr As DataTableReader
        For Each tbl In imp_ds.Tables
            idr = tbl.CreateDataReader()
            newDs.Load(idr, LoadOption.OverwriteChanges, newDs.Tables(tbl.TableName))
        Next



Оcталась одна проблема, как дальше заставить этот тепизированный датасет залить все данные в реальный DataSource (таблицу MDB) из памяти?
...
Рейтинг: 0 / 0
30.03.2015, 07:55
    #38920614
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Неужели ни у кого нет мыслей по этому вопросу. Зачем нужен вообще этот Dataset если такой геморрой его записать обратно в базу?
...
Рейтинг: 0 / 0
30.03.2015, 08:53
    #38920649
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Z_AlexЯ говорю про то, как его загрузить на локальном компе в базу MS Access
что-то я сомневаюсь, что в аксессную базу 80 гигов влезет
...
Рейтинг: 0 / 0
30.03.2015, 09:08
    #38920664
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
ИзопропилZ_AlexЯ говорю про то, как его загрузить на локальном компе в базу MS Access
что-то я сомневаюсь, что в аксессную базу 80 гигов влезет


Там 80 гигов и нету. Максимум 15-20 мегабайт
...
Рейтинг: 0 / 0
31.03.2015, 11:52
    #38922159
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Блин, неужели никому не приходилось полностью обновлять таблицу на сервере, предварительно обработав ее (пакетно) в Dataset?
Зачем он вообще нужен, ели получить в него данные проще простого, а записать обратно в таблицу на сервере нет готовых методов? тем более у типизированного..
...
Рейтинг: 0 / 0
31.03.2015, 13:24
    #38922356
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Z_AlexБлин, неужели никому не приходилось полностью обновлять таблицу на сервере, предварительно обработав ее (пакетно) в Dataset?
Зачем он вообще нужен, ели получить в него данные проще простого, а записать обратно в таблицу на сервере нет готовых методов? тем более у типизированного..Что значит нет готовых методов?

DataAdapter.Update Method
...
Рейтинг: 0 / 0
01.04.2015, 10:43
    #38923491
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
skyANAZ_AlexБлин, неужели никому не приходилось полностью обновлять таблицу на сервере, предварительно обработав ее (пакетно) в Dataset?
Зачем он вообще нужен, ели получить в него данные проще простого, а записать обратно в таблицу на сервере нет готовых методов? тем более у типизированного..Что значит нет готовых методов?

DataAdapter.Update Method

Бррр.. совсем ничего не вкурю..

беру по ссылке которую Вы привели прям оттуда пример. В нем очищаю таблицу. Т.е в тот пример (который написали мелкомягкие) добавил две строчки очистки таблицы

Код: vbnet
1.
2.
      dataSet.Tables(0).Clear()
            dataSet.Tables(0).AcceptChanges()



запускаю, функция выполняется, таблица в датасурсе не очищается ))

Код: vbnet
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.
 Public Function CreateCommandAndUpdate( _
    ByVal connectionString As String, _
    ByVal queryString As String) As DataSet

        Dim dataSet As DataSet = New DataSet

        Using connection As New OleDbConnection(connectionString)
            connection.Open()
            Dim adapter As New OleDbDataAdapter()

            adapter.SelectCommand = New OleDbCommand( _
                queryString, connection)

            Dim builder As OleDbCommandBuilder = _
                New OleDbCommandBuilder(adapter)

            adapter.Fill(dataSet)
            dataSet.Tables(0).Clear()
            dataSet.Tables(0).AcceptChanges()


            adapter.DeleteCommand = builder.GetDeleteCommand()
            adapter.UpdateCommand = builder.GetUpdateCommand()
            adapter.InsertCommand = builder.GetInsertCommand()
            ' Code to modify the data in the DataSet here.  

            ' Without the OleDbCommandBuilder this line would fail.
            
            adapter.Update(dataSet)
        End Using
        Return dataSet
    End Function



Может я не правильно задачу описал.
Если совсем коротко, то у меня в памяти есть Типизированный DataSet с таблицами. В таблицах есть данные.
Надо ПОЛНОСТЬЮ заменить все данные в DataSource на данные из Dataset.

Хеелппп!!

Простыми способами уже давно бы это сделал, но хочется сделать как то по правильному что-ли.
Смысла DataSet вообще никак понять не могу.
...
Рейтинг: 0 / 0
01.04.2015, 11:01
    #38923519
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Z_Alex, а Вы внимательно читайте статью по ссылке.

Где Вы там вызов Clear() и AcceptChanges() увидели, там чёрным по белому написано, что:
Calling the AcceptChanges method or AcceptChanges method will commit all changes in the DataSet or DataTable.
If either of these methods are called before the Update method is called, no changes will be committed when the Update method is called ,
unless further changes have been made since AcceptChanges or AcceptChanges was called.
...
Рейтинг: 0 / 0
02.04.2015, 12:18
    #38924831
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Z_AlexБлин, неужели никому не приходилось полностью обновлять таблицу на сервере, предварительно обработав ее (пакетно) в Dataset?

Немного изменил свой кусок кода.
Код: 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.
//База на MySQL - источник
            string myConnStr = String.Format("server={0};user id={1}; password={2}; database=SPD_DCE; pooling=false",
                IP, user, password); //База на MySQL - источник

            //База на MS SQL - назначение
            string msConnStr = ("Data Source=XXXXXX ;Initial Catalog=YYYYYYY;Integrated Security=SSPI");

using (SqlConnection mscon = new SqlConnection(msConnStr))
            using (MySqlConnection mycon = new MySqlConnection(myConnStr))
            {
                SqlCommand sql = new SqlCommand("truncate table NETS", mscon); //очищаю таблицу в которую буду заливать
                mscon.Open();
                sql.ExecuteNonQuery();


                MySqlCommand msql = new MySqlCommand("select * from NETS", mycon);
                mycon.Open();

                //Это у меня так, мне ничего обрабатывать не надо
                //MySqlDataReader mdr = msql.ExecuteReader(); //подготовка к получению данных

                DataTable dt = new DataTable(); //для Z_Alex
                dt.Load(msql.ExecuteReader()); //для Z_Alex
                /*
                 Вот тут таблицу можно обработать
                 */ 

                using (SqlBulkCopy bulkCopy =
                           new SqlBulkCopy(mscon))
                {
                    bulkCopy.DestinationTableName = "dbo.NETS";
                        

                    try
                    {
                        // Заливка данных

                        //Это у меня так, мне ничего обрабатывать не надо
                        //bulkCopy.WriteToServer(mdr);

                        bulkCopy.WriteToServer(dt.AsEnumerable().ToArray<DataRow>()); //для Z_Alex
                    }
                    finally
                    {

                        //mdr.Close(); 
                    }
                }
            }
...
Рейтинг: 0 / 0
03.04.2015, 02:17
    #38925771
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
Cat2,

Да спасибо. Примерно так и сделал. С помощью Command очищаю таблицы и вставляю в цикле записи.

Методы Clear, fill и другое копирование данных так и не получилось у меня прикрутить
...
Рейтинг: 0 / 0
03.04.2015, 02:25
    #38925772
Z_Alex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос данных из XML в БД через Dataset
т.е вот так. Может кому пригодится.


Код: vbnet
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.
Z_Alex,
....
 newDs.openxml(Filename)
  For Each tbl In newDs.Tables
            Delcmd = New OleDbCommand("delete * from " + tbl.TableName, conn)
            da = New OleDbDataAdapter("SELECT * FROM " + tbl.TableName, conn)
            cb = New OleDbCommandBuilder(da)
            ds = New DataSet()
            cb.GetDeleteCommand()
            cb.GetUpdateCommand()

            da.Fill(ds, tbl.TableName)
            da.TableMappings.Add(tbl.TableName, tbl.TableName)

            Dim dRow, NewdRow As DataRow
            Dim col As DataColumn
            Update_progress(status_field, "Загрузка таблицы " + tbl.TableName, progress, 0, frm)
            progress.ProgressBar.Maximum = 0
            progress.ProgressBar.Maximum = newDs.Tables(tbl.TableName).Rows.Count
            For Each dRow In newDs.Tables(tbl.TableName).Rows
                progress.ProgressBar.Value += 1
                progress.ProgressBar.Refresh()
                NewdRow = ds.Tables(tbl.TableName).NewRow
                For Each col In newDs.Tables(tbl.TableName).Columns
                    NewdRow(col.ColumnName) = dRow(col.ColumnName)
                Next
                ds.Tables(tbl.TableName).Rows.Add(NewdRow)
            Next
            da.Update(ds.Tables(tbl.TableName))
        Next
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перенос данных из XML в БД через Dataset / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]