Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
42 / 1 / 0
Регистрация: 21.04.2020
Сообщений: 111

Обновление данных из DataTable в базу данных Access

29.08.2020, 11:28. Показов 3622. Ответов 27

Студворк — интернет-сервис помощи студентам
Не производиться обновление базы из DataTable, ошибок не выдает уже не знаю в чем может быть причина. Ошибок при компиляции нет.

VB.NET
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
Imports System.Data.OleDb
 
Public Class Form1
    Private Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
        importExel()
    End Sub
    Private Sub importExel()
        Dim conn = New OleDbConnection With {
            .ConnectionString =
        "Provider = Microsoft.ACE.OLEDB.12.0;data source=" + IO.Path.Combine(Application.StartupPath, "DB\DBTelSg.accdb")
        }
        Dim conn_ex As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
                                         "Data Source='D:\DB\Телефонный справочник с корпоративными номерами 20.08.2020.xlsm';Extended Properties =""Excel 12.0;IMEX=1""")
        Dim dADapter As New OleDbDataAdapter("SELECT [Ф#И#О#], Должность, [Корп#-связь], [Личный-номер], [E-mail] FROM [Лист1$] Where [Ф#И#О#]is not null", conn_ex)
        Dim rows As Integer
        Dim tb2 As New DataTable
        Try
            rows = dADapter.Fill(tb2)
            DataGridView2.DataSource = tb2
 
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
 
        Dim SelCommand As New OleDbCommand("SELECT ФИО, Должность, [Служебный номер], [Личный номер], [Эл почта] from Spisok ", conn)
        Dim UpCommand As New OleDbCommand("UPDATE ФИО, Должность, [Служебный номер], [Личный номер], [Эл почта] from Spisok ", conn)
        Dim da As New OleDbDataAdapter(SelCommand)
        Dim tb1 As New DataTable
        Dim Arows As Integer
        Arows = da.Fill(tb1)
        Dim t1 = tb1.AsEnumerable
        Dim t2 = tb2.AsEnumerable
        Dim tt = t1.Union(t2, DataRowComparer.Default)
        Dim nDt As DataTable = tt.CopyToDataTable
        Dim nda As New OleDbDataAdapter(UpCommand)
        If nDt IsNot Nothing Then
            conn.Open()
            nda.Update(nDt)
            conn.Close()
            DataGridView1.DataSource = nDt
        End If
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2020, 11:28
Ответы с готовыми решениями:

Как сделать обновление, удаление, добавление в базу данных Access
Имеется подключённая база данных. подключал её через dataGridView1. Также на форме имеются 3 кнопки - обновление, удаление, добавление. Так...

Вывод данных из DataTable в базу данных SQL Server 2005
Доброго времени суток. Существует таблица DataTable dt = new DataTable(); Как передать данные из этой таблици в sql server 2005?

Добавить целую DataTable в базу данных
как ДОБАВИТЬ целую Datatable в базу данних, при этом нужно чтоби все старые данные в бд сохранялись

27
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
03.09.2020, 17:13
Лучший ответ Сообщение было отмечено Aleks_36 как решение

Решение

Студворк — интернет-сервис помощи студентам
Aleks_36, вариант более приближенный к вашей задаче. Для чтения из Excel использовал библиотеку SpreadsheetLight (для меня это более удобно).
PS. Библиотеку оставил в архиве.
Вложения
Тип файла: rar DataRefresh.rar (351.0 Кб, 3 просмотров)
1
42 / 1 / 0
Регистрация: 21.04.2020
Сообщений: 111
04.09.2020, 11:03  [ТС]
ovva, System.IO.FileNotFoundException: "Не удалось загрузить файл или сборку "DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" либо одну из их зависимостей. Не удается найти указанный файл."

Добавлено через 24 минуты
Цитата Сообщение от Aleks_36 Посмотреть сообщение
ovva, System.IO.FileNotFoundException: "Не удалось загрузить файл или сборку "DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" либо одну из их зависимостей. Не удается найти указанный файл."
отбой нашел

Добавлено через 53 минуты
В столбец "Email" данные не загружаються(пустой в Датагрид)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
       Private Function LoadX(ByVal name As String) As DataTable
            Dim tb As DataTable = New DataTable("tabX")
            With tb.Columns
            tb.Columns.Add(New DataColumn("FIO", GetType(String)))
            tb.Columns.Add(New DataColumn("Position", GetType(String)))
            tb.Columns.Add(New DataColumn("Office_phone", GetType(String)))
            tb.Columns.Add(New DataColumn("Personal_phone", GetType(String)))
            tb.Columns.Add(New DataColumn("Email", GetType(String)))
        End With
            Dim row As Integer
        Using sl As SLDocument = New SLDocument(name, "Лист1")
            Dim stats As SLWorksheetStatistics = sl.GetWorksheetStatistics()
            Dim ciStart As Integer = stats.StartColumnIndex
            For row = stats.StartRowIndex + 1 To stats.EndRowIndex
                If Not String.IsNullOrEmpty(sl.GetCellValueAsString(row, ciStart)) Then _
                        tb.Rows.Add(sl.GetCellValueAsString(row, ciStart + 1), sl.GetCellValueAsString(row, ciStart + 2), sl.GetCellValueAsString(row, ciStart + 3), sl.GetCellValueAsString(row, ciStart + 4))
            Next
        End Using
        Return tb
        End Function
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
04.09.2020, 13:29
Цитата Сообщение от Aleks_36 Посмотреть сообщение
VB.NET
1
2
If Not String.IsNullOrEmpty(sl.GetCellValueAsString(row, ciStart)) Then _
                        tb.Rows.Add(sl.GetCellValueAsString(row, ciStart + 1), sl.GetCellValueAsString(row, ciStart + 2), sl.GetCellValueAsString(row, ciStart + 3), sl.GetCellValueAsString(row, ciStart + 4))
Здесь ciStart это номер столбца начала блока данных. Далее проверяем в ячейке в этом столбце не пусто и начинаем считывать данные текущей строки. Номера столбцов д.б. ciStart, ciStart+1, ciStart+2, ciStart+3, ciStart+4. Посмотрите как у вас. Вообще-то блок может и не быть непрерывным, просто нужно будет указывать конкретные номера столбцов.
В InsertNewRows лучше вынести определение cmd за цикл
VB.NET
1
2
3
4
5
6
7
8
9
Dim cmd As New OleDbCommand(cmdText, conn)
For Each r As DataRow In tt
    cmd.Parameters.AddWithValue("@TreeX", r!Tree)
    cmd.Parameters.AddWithValue("@CountryX", r!Country)
    cmd.Parameters.AddWithValue("@MaxHeightX", r!MaxHeight)
    cmd.Parameters.AddWithValue("@YearX", r!Year)
    cmd.ExecuteNonQuery()
    cmd.Parameters.Clear()
Next
0
42 / 1 / 0
Регистрация: 21.04.2020
Сообщений: 111
04.09.2020, 14:36  [ТС]
Наконец то вставило в базу данных но ВСЮ таблицу получились дубли записей.
VB.NET
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
Imports System.Data.OleDb
Imports System.IO
Imports SpreadsheetLight
Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim xName As String = "D:\DB\Телефонный справочник с корпоративными номерами 20.08.2020.xlsm"
        Dim dbName As String = Path.Combine(Application.StartupPath, "DB\DBTelSg.accdb")
        Dim tbX As DataTable = LoadX(xName)
        DataGridView2.DataSource = tbX
        InsertNewRows(dbName, tbX)
    End Sub
    Private Function LoadX(ByVal name As String) As DataTable
        Dim tb As DataTable = New DataTable("tabX")
        With tb.Columns
            tb.Columns.Add(New DataColumn("FIO", GetType(String)))
            tb.Columns.Add(New DataColumn("Position", GetType(String)))
            tb.Columns.Add(New DataColumn("Office_phone", GetType(String)))
            tb.Columns.Add(New DataColumn("Personal_phone", GetType(String)))
            tb.Columns.Add(New DataColumn("Email", GetType(String)))
        End With
        Dim row As Integer
        Using sl As SLDocument = New SLDocument(name, "Лист1")
            Dim stats As SLWorksheetStatistics = sl.GetWorksheetStatistics()
            Dim ciStart As Integer = stats.StartColumnIndex + 1
            For row = stats.StartRowIndex + 1 To stats.EndRowIndex
                If Not String.IsNullOrEmpty(sl.GetCellValueAsString(row, ciStart)) Then _
                        tb.Rows.Add(sl.GetCellValueAsString(row, ciStart), sl.GetCellValueAsString(row, ciStart + 1), sl.GetCellValueAsString(row, ciStart + 2), sl.GetCellValueAsString(row, ciStart + 3), sl.GetCellValueAsString(row, ciStart + 4))
            Next
        End Using
        Return tb
    End Function
    Private Sub InsertNewRows(ByVal name As String, ByVal tbX As DataTable)
        Try
            Using conn As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" & name & ";Password=;")
                conn.Open()
                Dim ad As New OleDbDataAdapter()
                ad.SelectCommand = New OleDbCommand("SELECT * FROM Spisok", conn)
                Dim tb1 As New DataTable("tab1")
                ad.Fill(tb1)
                DataGridView1.DataSource = tb1
                Dim t1 = tb1.AsEnumerable
                Dim t2 = tbX.AsEnumerable
                Dim tt = t2.Except(t1, DataRowComparer.Default)
                Dim cmdText As String = "INSERT INTO Spisok ([ФИО], [Должность], [Служебный номер], [Личный номер], [Эл почта]) VALUES (@FIOX, @PositionX, @Office_phoneX, @Personal_phoneX, @EmailX )"
                Dim cmd As New OleDbCommand(cmdText, conn)
                For Each r As DataRow In tt
                    cmd.Parameters.AddWithValue("@FIOX", r!FIO)
                    cmd.Parameters.AddWithValue("@PositionX", r!Position)
                    cmd.Parameters.AddWithValue("@Office_phoneX", r!Office_phone)
                    cmd.Parameters.AddWithValue("@Personal_phoneX", r!Personal_phone)
                    cmd.Parameters.AddWithValue("@EmailX", r!Email)
                    cmd.ExecuteNonQuery()
                    cmd.Parameters.Clear()
                Next
                conn.Close()
            End Using
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
04.09.2020, 15:34
Цитата Сообщение от Aleks_36 Посмотреть сообщение
вставило в базу данных но ВСЮ таблицу получились дубли записей
Проверьте, это действительно дубли или все же какие-то поля различаются.
Вставляйте точки останова и проверяйте значения переменных на разных этапах вычислений: значения tbX, tb1, tt и т.д. Ничего более определенного сказать не могу, не видя проекта и данных.
Могу предложить вам несколько иной вариант решения, где в качества базы данных используется LiteDB (простая NoSQL база данных для NET). Здесь на форуме есть примеры ее использования:
https://www.cyberforum.ru/post13436877.html
https://www.cyberforum.ru/post13672388.html
PS. Когда переделаете под свои данные, базу myData.db удалите. При первом запуске и выборе "Insert rows" она будет сформирована заново и заполнена данными из файла Excel.
Вложения
Тип файла: rar NoSqlRefresh.rar (473.8 Кб, 2 просмотров)
0
42 / 1 / 0
Регистрация: 21.04.2020
Сообщений: 111
04.09.2020, 15:48  [ТС]
Цитата Сообщение от ovva Посмотреть сообщение
Проверьте, это действительно дубли или все же какие-то поля различаются.
DataGridView1.DataSource = tt.CopyToDataTable
В дата грид точная копия таблицы эксель
0
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 843
04.09.2020, 15:53
Aleks_36, Где получились дубли записей в БД или в дгв отображаются? Я за данной темой постоянно наблюдал очень интересная тема для меня оказалась. В приложени от ovva, я добавил несколько строк и дубли исчезли из tb1 а в БД у меня дублей нет. Вот код процедуры где я внес изменения:
VB.NET
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
Private Sub InsertNewRows(ByVal name As String, ByVal tbX As DataTable)
        Try
            Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & name & ";Password=;")
                conn.Open()
                Dim ad As New OleDbDataAdapter()
                ad.SelectCommand = New OleDbCommand("SELECT * FROM Table1", conn)
                Dim tb1 As New DataTable("tab1")
                ad.Fill(tb1)
                DataGridView1.DataSource = tb1
                Dim t1 = tb1.AsEnumerable
                Dim t2 = tbX.AsEnumerable
                Dim tt = t2.Except(t1, DataRowComparer.Default)
                Dim cmdText As String = "INSERT INTO Table1 ([Tree], [Country], [MaxHeight], [Year]) VALUES (@TreeX, @CountryX, @MaxHeightX, @YearX)"
                For Each r As DataRow In tt
                    Dim cmd As New OleDbCommand(cmdText, conn)
                    cmd.Parameters.AddWithValue("@TreeX", r!Tree)
                    cmd.Parameters.AddWithValue("@CountryX", r!Country)
                    cmd.Parameters.AddWithValue("@MaxHeightX", r!MaxHeight)
                    cmd.Parameters.AddWithValue("@YearX", r!Year)
                    cmd.ExecuteNonQuery()
                Next
                tb1.Rows.Clear()
                ad.SelectCommand = New OleDbCommand("SELECT * FROM Table1", conn)
                ad.Fill(tb1)
                DataGridView1.DataSource = tb1
                conn.Close()
            End Using
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
Это строки после Next там идет очищение tb1 от строк, перезаливка tb1 и соответственнно дгв
0
42 / 1 / 0
Регистрация: 21.04.2020
Сообщений: 111
04.09.2020, 16:47  [ТС]
andrsh, Не надо ничего там был мой косяк в коде ("SELECT * FROM Table1"
а там есть еще поле код, поэтому при сравнении все строки оказались уникальными.
Счас все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.09.2020, 16:47

Запись и обновление данных в DataTable из BackgroudWorker
В классе главной формы есть таблица DataTable. В процессе работы запускается несколько BackgroundWorker (запрос к БД). В начале DoWork...

Обновление таблицы базы данных из DataTable
Приветствую всех. Вот какая проблема надо обновлять таблицу база данных данными из datatable делал так SQLiteCommand command =...

Загрузка данных из Excel в базу данных Access на VBA
Буду очень рад если кто-нибудь приведет более менее понятный код, как можно это реализовать средствами VBA

Пишу базу данных на основе данных из базы access
Здравствуйте уважаемые форумчане)) у меня к вам несколько вопросов 1) как сделать так чтобы при каждом запуске программа считывала все...

Сохранение данных, добавленных в базу данных access
Помогите сделать сохранение добавленных данных в бд, при перезапуске программы Вот код бд: private void metroButton3_Click(object...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru