Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
24.04.2024, 02:28:31

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 242 Сообщений в 5 457 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  как импортировать таблицу из excel в MS SQL
Страниц: [1]   Вниз
Печать
Автор Тема: как импортировать таблицу из excel в MS SQL  (Прочитано 2716 раз)
0 Пользователей и 1 Гость смотрят эту тему.
drug
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« : 26.02.2021, 13:48:11 »

Научите, пожалуйста, как забросить таблицу Excel в БД MS SQL в таблицу с таким же набором полей по нажатию кнопки с помощью VBA при чем те, в которых были изменения
id vid number Format square manager
1 Заяц 1 большая 30 Иванов А.С.
2 Волк 2 маленькая 40 Гусь А.И.

Может есть какой понятный пример
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #1 : 26.02.2021, 14:23:53 »

А Вы вообще работали из VBA с базами данных? SQL владеете? Запрос на изменение нужных полей составить можете? Хоть какие-то понятия есть об этом или полное непонимание происходящего? Если нет, то ни один пример не будет понятным.
« Последнее редактирование: 26.02.2021, 14:26:33 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #2 : 26.02.2021, 17:35:51 »

В общем если совсем кратко, то код может быть и таким:
Код: (vb)
Sub SQL_WriteVals()
    Dim adCon As Object, adRec As Object

    Set adCon = CreateObject("ADODB.Connection")
    Set adRec = CreateObject("ADODB.Recordset")
    adCon.Provider = "SQLOLEDB"
    adCon.ConnectionString = "Server=XXX.XXX.XXX.XXX; Database=DB_Name; User ID=XXXX; pwd=XXXXX"
    adCon.Mode = 3 'adModeReadWrite
    adCon.Open
    Set adRec = adCon.Execute("INSERT INTO Table_name (id, vid, number, Format, square, manager) VALUES (1, 'Заяц', 1, 'большая', 30, 'Иванов А.С.')")
    adCon.Close
End Sub

надо указать сервер и все явки-пароли. И имя таблицы тоже. Так же обязательно учитывать и типы полей.
« Последнее редактирование: 26.02.2021, 17:46:50 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
drug
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #3 : 28.02.2021, 10:37:29 »

Только SQL знаю...

Спасибо за ответ!
А если таблица у меня не из 2-3х строк, а их куча, то каким-то образом их нужно перебрать
« Последнее редактирование: 28.02.2021, 12:43:16 от vikttur » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #4 : 28.02.2021, 11:54:17 »

Не надо цитировать полностью мое сообщение. Особенно, когда в цитировании вообще нет необходимости: п.п. 4.18 Правил форума
то каким-то образом их нужно перебрать
вполне очевидно, что циклом. Что-то вроде этого:
Код: (vb)
Sub AddToDB()
    asFields = Range("A1:F1").Value 'заголовки(должны быть в точности как названия полей в БД)
    aData = Range("A2:F10").Value 'данные для переноса в БД
    Set adCon = CreateObject("ADODB.Connection")
    Set adRec = CreateObject("ADODB.Recordset")
    
    adCon.Provider = "SQLOLEDB"
    adCon.ConnectionString = "Server=XXX.XXX.XXX.XXX; Database=DB_Name; User ID=XXXX; pwd=XXXXX"
    adCon.ConnectionTimeout = 15
    adCon.CommandTimeout = 30

    adRec.CursorType = 1  'ADODB.CursorTypeEnum.adOpenKeyset
    adRec.LockType = 2    'ADODB.LockTypeEnum.adLockPessimistic
    adCon.Open
    adRec.Open "select * from Table_name", adCon
    adCon.BeginTrans 'начало трансфера - чтобы все сразу передать и потом обновить

    For lr = LBound(aData) To UBound(aData)
        adRec.AddNew
        For lf = LBound(asFields) To UBound(asFields)
            If asFields(lf) <> "" Then
                If aData(lr, lf) <> "" Then
                    adRec.Fields(asFields(lf)).Value = aData(lr, lf)
                End If
            End If
        Next
    Next
    adRec.UpdateBatch
    adCon.CommitTrans
    adRec.Close
    adCon.Close
End Sub

переменные не забудьте сами объявить по образу и подобию кода выше.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
drug
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #5 : 02.03.2021, 12:23:55 »


Ругается на ваш скрипт на строку
 If asFields(lf) <> "" Then

Мне задачу немного уточнили-нужно обновить данные в таблице базы ,только там где произошли изменения.
Т.е нужно сравнить данные из базы и данные новые.

Как я понимаю алгоритм решения примерно такой: выгружаю данные из БД на лист, на другом листе какие-то изменения вносит пользователь-заполняет например пустые столбцы, но не полностью. И вот эти изменения нужно внести в БД.

Т.е. перед апдейтом перебрать и сравнить старое(на одном листе) и новое значение (на другом).
Если не равны, делаем update table.
 
Я выгружаю данные из БД
Код: (vb)
Sub LoadData()
Dim adCon As Object, adRec As Object

  Set adCon = CreateObject("ADODB.Connection")
    Set adRec = CreateObject("ADODB.Recordset")
    
 adCon.Provider = "SQLOLEDB"
  adCon.ConnectionString = "Server=ххх; Database=ххх; User ID=ххх; Password=ххх"
  adCon.Open

adRec.Open "SELECT id, vid, number, Format, square, manager  FROM [dbo].ххх", adCon
ActiveSheet.Range("A2").CopyFromRecordset adRec
adRec.Close
adCon.Close
Set adRec = Nothing
Set adCon = Nothing
End Sub

Комментарий администратора Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума

Теперь загвоздка как сравнить в цикле данные одного листа и другого и при отличии произвесьти загрузку
« Последнее редактирование: 02.03.2021, 13:51:56 от Дмитрий Щербаков(The_Prist) » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #6 : 02.03.2021, 13:50:50 »

Ругается на ваш скрипт на строку
 If asFields(lf) <> "" Then
ну да. Забыл дописать:
Код: (vb)
If asFields(lf, 1) <> "" Then

Мне задачу немного уточнили
Без обид, но здесь не решалка рабочих задач, которые сразу не могут решиться и потом еще в рабочем порядке уточняются Улыбка Мы всегда рады помочь в чем-то конкретном, разъяснить почему что-то не получается и дать верное направление, подсказать по решению. Но выдавать при каждом "уточнении" готовые решения - увы, не совсем та ветка. Хотя кому-то может будет интересно порешать Ваши задачи из спортивного интереса.
Основной механизм записи в БД вроде показан - сравнение листов уже выходит за рамки этой темы. Да там и не так быстро все сделать, т.к. надо искать сначала по id в обеих таблицах, сравнивать значения всех полей(притом могут быть нюансы вроде типов). При этом учесть, что какую-то строку могут удалить, а какую-то добавить. Это 100% выплывает в последующих уточнениях.
По сути это не самый сложный цикл, но писать его муторно и учесть надо немало. Начните сами хоть что-то и задавайте более конкретные вопросы.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
drug
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #7 : 02.03.2021, 14:39:16 »


Спасибо вам! за идею подхода к решению
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru