Как вставить данные из Excel в базу данных - PullRequest
0 голосов
/ 22 октября 2019

Я ищу решение для импорта данных из файла Excel в базу данных (например, файл MS Access).

Я могу получить представление как о структуре, так и потому, что яплохо знакомый с чем-то подобным, это действительно трудно закончить работу.

Ниже мой код, который должен сделать это:

  1. Выбор базы данных
  2. Выбор файлов импорта
  3. Создать соединение, используя ADODB
  4. Я застрял здесь, используя оператор Insert для импорта, но как? Поскольку значения для импорта будут значением переменной, которая запускается от самой первой ячейки файлов Excel до ее конца.

Пожалуйста, игнорируйте комментарий, потому что я использую свой родной язык для упрощенияпонять в будущем

Sub Import_Data()
'Khai bao bien lien quan den Database
Dim connection As ADODB.connection
Dim record As ADODB.Recordset
'Khai bao cau lenh Query
Dim SQLstr As String
'Khai bao connection string
Dim connectionstring As String
Dim dbstring As String
'Duong dan den file import
Dim fdlg As FileDialog


Application.ScreenUpdating = False
'Chon datafile
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Access files", "*.accdb, *.mdb"
If .Show = True Then
datapath = .SelectedItems(1)
Else
Exit Sub
End If
End With


'Chon file import
Set fdlg = Application.FileDialog(msoFileDialogFilePicker)
With fdlg
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel files", "*.xls,*.xlsx,*.xlsm"
If .Show = True Then
importstring = .SelectedItems(1)
Else
Exit Sub
End If
End With

'Connect to Database
Set connection = New ADODB.connection
With connection
.Provider = "Microsoft.ACE.OLEDB.12.0"
.connectionstring = "Data Source=" & datapath & ";"
.ConnectionTimeout = 30
.Open
If .State = adStateOpen Then
MsgBox "welcome " & Environ("Username") & " ket noi den database"
Else: Exit Sub
End If
End With

Dim a, c As Integer
Dim b, d As Integer
Dim ImpWb As Workbook
Dim ImpWs As Worksheet

Set ImpWb = Application.Workbooks.Open(importstring)
ImpWb.Application.Visible = True
Set ImpWs = ImpWb.Worksheets("Sheet1")
With ImpWs.UsedRange
a = .Rows.Count
b = .Columns.Count
For c = 2 To a
For d = 1 To b
SQLstr = "Insert into Test values(" & Cells(c, d).Value & ")"
connection.Execute SQLstr
Next d
Next c
End With
ImpWb.Close
connection.Close
Set ImpWs = Nothing
Set ImpWb = Nothing
Set connection = Nothing
End Sub

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Из вышеприведенных комментариев стало ясно, что проблема, с которой вы сталкиваетесь, , как создавать операторы SQL внутри VBA . Тем не менее, вы намного ближе, чем вы думаете.

Эта функция ниже создаст оператор вставки для каждой строки данных , при условии, что столбцы на вкладке Excel точно соответствуют и в точном порядке соответствуютполя в таблице SQL . Он также объединит все вставки в один оператор, чтобы вы могли выполнить все строки одновременно.

With ImpWs.UsedRange

    a = .Rows.Count
    b = .Columns.Count

    For c = 2 To a

        SQLstr = SQLstr & "INSERT INTO TEST VALUES("

        For d = 1 To b

            SQLstr = SQLStr & .Cells(c, d).Value & iif(d <> b, ",","")

        Next d

        SQLstr = SQLStr & ");"

    Next c

End With

Другое предостережение заключается в том, что все поля являются числовыми. Если у вас есть несколько текстовых полей, вам нужно будет добавить ' до и после каждого поля, например ' & .Cells(c, d).Value & & '. Если вам известны столбцы, для которых требуется текст, при необходимости можно изменить ввод с помощью Выбрать регистр для номера столбца.

0 голосов
/ 22 октября 2019

Привет, вы уже узнали или обнаружили волшебную функцию connection.execute. Здесь играет музыка. Все, что ему нужно - это корректная строка SQL для вставки. Это (почти) все. Строки SQL могут быть запущены один за другим или группа, разделенная ";"в конце

INSERT INTO table1 (column1,column2 ,..)
    VALUES 
        (value1,value2 ,...),
        (value1,value2 ,...),
        ...
         (value1,value2 ,...); --<<<<<<<<<<< see the ";"

В вашем случае вы должны определить соответствующие столбцы в первой строке, а затем просто все значения для строки внутри фигурных скобок. Если это не работает - что-то не так со строкой SQL. Вы можете использовать доступ с хорошим SQL-компоновщиком для создания шаблона sql или, возможно, использовать онлайн-тестер sql, чтобы проверить, является ли ваш sql действительным. В целях тестирования я предлагаю сначала добавить одну строку. И еще один намек: ценностям нужно избегать! Поэтому сначала добавьте что-нибудь тривиальное, например «abc» или 1234, просто чтобы проверить основную функцию. Жизненные данные могут иметь такие вещи, как>> <внутри или «,» или другие вещи, которые можно рассматривать как оператор SQL. Что в конечном итоге будет выглядеть так, будто ничего не будет делать. Так что читайте руководство, как доступ избегал таких отравленных фрагментов текста;) И реализовать функцию, чтобы избежать этого. SQLITE имеет хороший учебник и пример страницы. SQLITE почти как доступ. Чтобы получить обзор, я бы сначала прочитал там, а потом документацию по M $, а потом немного. Удачи:) </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...