2012-05-09 1 views
1

Итак, я перешел к следующему MSDN Resource Page, в котором рассматривается использование объектов ADO. Моя проблема в том, что я не могу заставить ее работать.Использование ADO в доступе для импорта данных CSV

Что я пытаюсь сделать, это открыть CSV-файл и прочитать его по очереди, а затем создать инструкции SQL INSERT для вставки записей в существующую таблицу в Access 2010. Я попытался найти более простой способ делая это, но это, по-моему, единственный вариант. делая это с включенными инструментами, но до сих пор мне не повезло.

Основная проблема здесь в том, что у меня есть файлы CSV с несогласованными заголовками. Я хочу импортировать 5 файлов в одну и ту же таблицу, но каждый файл будет отличаться в зависимости от того, какие поля содержат данные. Эти поля без данных в них игнорировались во время извлечения. Вот почему я не могу использовать что-то вроде DoCmd.TransferText.

Итак, теперь мне нужно создать скрипт, который откроет текстовый файл, прочитает заголовки в первой строке и создаст инструкцию SQL INSERT, зависящую от конфигурации этого конкретного файла.

У меня такое чувство, что у меня есть хорошая ручка о том, как оценивать проблему, но независимо от того, что я пытаюсь, я не могу заставить вещи работать с помощью ADO.

Может ли кто-нибудь объяснить, как я могу это достичь? Моя точка привязки - получение БД доступа для получения информации из файлов CSV через ADO.

+0

Ваш подход кажется правильным. Опубликуйте то, что у вас есть до сих пор (раздел, который терпит неудачу), и сообщество должно быть в состоянии помочь вам лучше. – Pynner

ответ

2

Вместо того, чтобы читать файл CSV по очереди, а затем делать что-то с каждой строкой, я думаю, вы должны открыть файл как набор записей ADO. И откройте набор записей DAO для вашей таблицы назначения доступа.

Затем вы можете перебирать поля в каждой строке набора записей ADO и добавлять их значения в новую строку набора записей DAO. Пока таблица назначения включает поля с одинаковыми именами и совместимыми типами данных в виде полей CSV, это может быть довольно плавным.

Public Sub Addikt() 
#If ProjectStatus = "DEV" Then 
    ' needs reference for Microsoft ActiveX Data Objects 
    Dim cn As ADODB.Connection 
    Dim fld As ADODB.Field 
    Dim rs As ADODB.Recordset 
    Set cn = New ADODB.Connection 
    Set rs = New ADODB.Recordset 
#Else ' assume PROD 
    Const adCmdText As Long = 1 
    Const adLockReadOnly As Long = 1 
    Const adOpenForwardOnly As Long = 0 
    Dim cn As Object 
    Dim fld As Object 
    Dim rs As Object 
    Set cn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 
#End If 
    Const cstrDestination As String = "tblMaster" 
    Const cstrFile As String = "temp.csv" 
    Const cstrFolder As String = "C:\share\Access" 
    Dim db As DAO.Database 
    Dim rsDao As DAO.Recordset 
    Dim strConnectionString As String 
    Dim strName As String 
    Dim strSelect As String 

    strConnectionString = "Provider=" & _ 
     CurrentProject.Connection.Provider & _ 
     ";Data Source=" & cstrFolder & Chr(92) & _ 
     ";Extended Properties='text;HDR=YES;FMT=Delimited'" 
    'Debug.Print strConnectionString 
    cn.Open strConnectionString 

    strSelect = "SELECT * FROM " & cstrFile 
    rs.Open strSelect, cn, adOpenForwardOnly, _ 
     adLockReadOnly, adCmdText 

    Set db = CurrentDb 
    Set rsDao = db.OpenRecordset(cstrDestination, _ 
     dbOpenTable, dbAppendOnly + dbFailOnError) 

    Do While Not rs.EOF 
     rsDao.AddNew 
     For Each fld In rs.Fields 
      strName = fld.Name 
      rsDao.Fields(strName) = rs.Fields(strName).value 
     Next fld 
     rsDao.Update 
     rs.MoveNext 
    Loop 

    rsDao.Close 
    Set rsDao = Nothing 
    Set db = Nothing 
    rs.Close 
    Set rs = Nothing 
    cn.Close 
    Set cn = Nothing 
End Sub 

Это раздел Объявления модуля, где я сохранил эту процедуру:

Option Compare Database 
Option Explicit 
#Const ProjectStatus = "DEV" '"DEV" or "PROD" 

Изменение значения этих констант, чтобы проверить его на вашей системе:

Const cstrDestination As String = "tblMaster" 
Const cstrFile As String = "temp.csv" 
Const cstrFolder As String = "C:\share\Access" 

Записка имя папки не включает обратную косую черту.

Вы захотите адаптировать эту процедуру для передачи имени файла в качестве параметра вместо того, чтобы оставить его как константу. И если ваши файлы CSV хранятся в нескольких каталогах, вам также необходимо передать имя папки в качестве параметра.

Надеюсь, вам будет показано, как это сделать для одного файла, и вы можете взять его здесь, чтобы обрабатывать все ваши CSV-файлы. Также рассмотрите возможность добавления обработки ошибок.

+0

Быстрый вопрос об этом методе. Почему вы используете ADO и DAO? Не можете ли вы создать два подключения ADO? Или у DAO есть более надежный набор функций для программ MS? Я попробую это позже сегодня вечером. Если я могу заставить его работать для одного файла, у меня есть сценарий, который я могу использовать для итерации всех папок/файлов, которые я только вызову из рабочей функции. Я дам вам знать, как все складывается, и спасибо за помощь! – toolshed

+1

DAO может быть значительно быстрее, чем ADO для данных, хранящихся в Jet/ACE. – HansUp

+0

Еще один вопрос для вас. Что случилось с утверждением If наверху? – toolshed

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

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