powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перенос данных из XML в БД через Dataset
20 сообщений из 20, страница 1 из 1
Перенос данных из XML в БД через Dataset
    #38917181
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день друзья! Стоит задача написать Локальную кассу для удаленных магазинов (в основном все работают через терминал, но часто стала пропадать связь, так что поставили задачу обеспечения работы кассы локально). Сам интерфейс работы кассы уже написал и все работает. Осталось решить задачу синхронизации данных. Вернее полная очистка локальных таблиц лежащих в 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
Перенос данных из XML в БД через Dataset
    #38917279
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z_Alex,

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

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

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

Со стороны сервера файл XML итак формируется на MS SQL 2008. Я говорю про то, как его загрузить на локальном компе в базу MS Access
...
Рейтинг: 0 / 0
Перенос данных из XML в БД через Dataset
    #38917360
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MS SQL 2008 стоит на главном сервере, который ведет складской учет и учет в магазинах. В удаленных магазинах и хотим поставить кассу на .Net + данные хранящиеся в МS ACCESS чтобы только могли делать продажи и потом опять же XML файлом выгружать продажи за день на сервер по FTP или mail
...
Рейтинг: 0 / 0
Перенос данных из XML в БД через Dataset
    #38917396
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes(если файл данных очень большой, например 80 гб, то с XML вы его вряд ли загрузите :) )
Да хоть терабайт. Ридером читаешь файл, вообще никаких проблем.
...
Рейтинг: 0 / 0
Перенос данных из XML в БД через Dataset
    #38917470
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перенос данных из XML в БД через Dataset
    #38918325
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны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
Перенос данных из XML в БД через Dataset
    #38920614
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели ни у кого нет мыслей по этому вопросу. Зачем нужен вообще этот Dataset если такой геморрой его записать обратно в базу?
...
Рейтинг: 0 / 0
Перенос данных из XML в БД через Dataset
    #38920649
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z_AlexЯ говорю про то, как его загрузить на локальном компе в базу MS Access
что-то я сомневаюсь, что в аксессную базу 80 гигов влезет
...
Рейтинг: 0 / 0
Перенос данных из XML в БД через Dataset
    #38920664
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилZ_AlexЯ говорю про то, как его загрузить на локальном компе в базу MS Access
что-то я сомневаюсь, что в аксессную базу 80 гигов влезет


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

DataAdapter.Update Method
...
Рейтинг: 0 / 0
Перенос данных из XML в БД через Dataset
    #38923491
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Перенос данных из XML в БД через Dataset
    #38923519
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перенос данных из XML в БД через Dataset
    #38924831
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Перенос данных из XML в БД через Dataset
    #38925771
Z_Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

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

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


Код: 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
20 сообщений из 20, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перенос данных из XML в БД через Dataset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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