2009-11-02 3 views
2

Каков самый быстрый способ импортировать данные в базу данных SQL Server непосредственно из активного листа в Excel?Какой самый быстрый способ для импорта из активного листа в Excel на SQL Server?

У меня был большой успех, просто прокручивая строки и столбцы, создавая строку SQL, открывая ADODB.Connection и выполняя SQL. Однако это решение слишком медленное для больших наборов данных.

Так что я тестирую Jet Provider с помощью ADO. Это определенно быстрее, но для этого требуется, чтобы рабочая книга была сохранена, и я не могу требовать от пользователя сохранения рабочей книги перед ее загрузкой.

Следующий код работает, если книга сохранена, но если ActiveWorkbook никогда не был сохранен, ActiveWorkbook.Path возвращает пустую строку и код не работает.

Sub UploadViaJet() 

    Dim objADO As New ADODB.Connection 
    Dim strSQL As String 
    Dim lngRecsAff As Long 

    Set objADO = New ADODB.Connection 

    objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
     "Data Source=" & ActiveWorkbook.Path & _ 
     "\" & ActiveWorkbook.Name & ";" & _ 
     "Extended Properties=Excel 8.0" 

    strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _ 
     "Server=<server>;Database=<database>;" & _ 
     "UID=<UID>;PWD=<PWD>].test_table " & _ 
     "FROM [" & ActiveSheet.Name & "$]" 

    objADO.Execute strSQL, lngRecsAff, adExecuteNoRecords 

End Sub 

Есть ли более простой и быстрый способ сделать это?

ответ

1

Решение с помощью импорта файла Excel

Поскольку у вас есть ограничение на не заставляя пользователя, чтобы сохранить файл, и большинство предлагаемых решений требует, чтобы файл был сохранен, я хотел бы использовать VBA для

  • создать объект рабочей книги в памяти
  • копию пасты из активного листа в рабочую книгу
  • SAVEAS книгу на имя временного файла (TempExcelFile.xls) и путь
  • использование метода Quassnoi в выше импортировать в SQL Server
  • перезапись TempExcelFile.xls нулями
  • удаления TempExcelFile.xls

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

Чтобы облегчить одновременное импорт нескольких активных рабочих листов, я бы использовал временную метку или GUID для создания имен файлов.


Решение с помощью ADO запросов

Попросите пользователей создать свои книги из шаблона, который имеет VBA макросов, встроенные в Убедитесь, что вы защитить книгу, чтобы предотвратить несанкционированный доступ к макросов/код позади.

Выполнение макроса, который будет проходить через строки и столбцы, считывать значения ячеек, строить SQL-запрос и выполнять его - использовать хранимые процедуры с параметрами для предотвращения инъекционных атак.

+0

Почему бы просто не использовать API-интерфейс временного файла Windows? –

+0

Это хорошая идея, за исключением того, что в вопросе указывается, что пользователю не следует запрашивать сохранение файла. Таким образом, копирование содержимого в другой файл и использование Windows Temp File API было бы моим выбором. –

+0

Я использую ADO распределенные запросы до этого момента. Он работал хорошо для меня, но мои размеры данных выросли до такой степени, что операции выполняются в течение длительного времени и иногда превышают объем памяти компьютера. Использование временного файла кажется хорошим решением, даже если оно требует управления временным файлом. Спасибо Радж! – Kuyenda

1

Обычно я импортирую большие файлы Excel с помощью SSIS.

+0

Это не может быть сделано, если книга не сохранена. –

+0

HLGEM, можете ли вы рассказать о SSIS? Я ищу учебник по использованию SSIS с Excel, но еще не нашел ничего полезного. У вас есть образец кода? Благодарю. – Kuyenda

2

Вы можете создать источник данных (с помощью связанного сервера или OPENROWSET) и просто сделать SELECT на SQL Server стороне:

SELECT * 
INTO mytable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]') 

Путь с Excel книги должны быть доступны по SQL Server.

Здесь KB article о том, как это сделать.

+0

Это требует, чтобы рабочая книга была сначала загружена на сервер, правильно? – Kuyenda

+0

Он должен быть доступен с помощью 'SQL Server', это будет также путь UNC. Но, вообще говоря, да, он должен быть загружен. – Quassnoi

+0

Да, это требует сохранения файла. См. Мой ответ для возможного решения этого. –

0

Вы пытались просто поместить ActiveWorkBook.SaveAs («некоторое временное имя файла») вверху и импортировать из этого? Я делаю что-то подобное с макросом для FTP-содержимого ActiveSheet на удаленном сервере, и он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^