2013-06-15 3 views
1

У меня есть древняя система, которая использует базу данных Access 97 для хранения информации. Я хочу скопировать данные из 90-некоторых таблиц в базу данных SQL Server 2008 ежедневно. У меня уже есть таблицы, определенные в SS2008.Копирование Access 97 таблиц в SQL Server 2008 R2 64-разрядная ежедневная

Существует одинаково старое задание DTS, которое имеет отдельную коробку-коробку для каждой таблицы. Я предпочел бы использовать более простой в обслуживании метод, который был написан в коде, а не в строках и блоках. (да, я знаю, что строки и поля SSIS переведены в XML, но для меня это трудно читать и писать.)

Я не могу использовать Linked Server или OPENROWSET, потому что мой сервер SS2008 работает как 64-разрядный процесс, поэтому драйвер OLEDB Jet недоступен. Драйвер OLEDB MSOffice ACE 12.0 является 64-разрядным, но он не должен использоваться с серверами баз данных, поскольку он не является потокобезопасным (согласно Microsoft). Кроме того, я не могу заставить его работать («Не удалось найти устанавливаемый ISAM») в SS2008, несмотря на обширные исследования. Я могу прочитать таблицу Access с OLEDB Jet в 32-разрядной программе, такой как SSIS.

Итак, я ищу современное, не прямоугольное и элегантное 32-битное решение для копирования таблиц из файла доступа mdb/mdw на SS2008.

Могу ли я сделать это с помощью:

  • один T-SQL скрипта
  • некоторые C# вещи, которая делает самоанализ, чтобы определить структуру таблицы, а затем выполняет SQL для каждой таблицы
  • немного магии «копировать каждый таблица из этого OLEDB к этому SQL Server»пакет

Есть несколько близких Dups этого вопроса (Copy access database to SQL server periodically, Migrating Access Tables to SQL Server - Beginner), но ни что де al с 32-битным ограничением, которое делает OPENROWSET/Linked Server не опцией.

+1

Возможный дубликат http://stackoverflow.com/questions/6709670/how-do-i-import-ms-access -data-in-sql-server-using-ssis-package –

+0

спасибо за указатель, я не видел этого в своих исследованиях. к сожалению, для использования этого решения в этом случае мне пришлось бы генерировать 90 таких маршрутов в виде коробки. Я предпочел бы решение, в котором я могу перебирать таблицы и извлекать из Access и нажимать на SQL (так как схемы идентичны) – patrickmdnet

ответ

1

Я отдал свой голос за некоторые вещи C#. Возможно, вам придется следить за использованием памяти, если у вас большие таблицы.

Основная идея выглядит следующим образом:

foreach(tableName in access) 
    get the table from access 
    optionally clear the target table 
    sqlbulkcopy it to target database 

Более сложное решение было бы захватить обе таблицы и обновлять только измененные строки.

+0

Это то, что я закончил делать. Я ознакомился с GetOleDbSchemaTable, создал таблицы с ExecuteNonQuery, затем SqlBulkCopy, чтобы скопировать данные. – patrickmdnet

2

Вы могли бы сделать это внутри самой Access с помощью VBA, как следующее:

Public Function CopyTableDataToSqlServer() 
Dim tbd As DAO.TableDef, qdf As DAO.QueryDef, connStr As String 
connStr = _ 
     "ODBC;" & _ 
     "Driver={SQL Server};" & _ 
     "Server=.\SQLEXPRESS;" & _ 
     "Database=cloneDB;" & _ 
     "Trusted_Connection=yes;" 
For Each tbd In CurrentDb.TableDefs 
    If Not ((tbd.Name Like "MSys*") Or (tbd.Name Like "~*")) Then 
     Debug.Print tbd.Name 
     Set qdf = CurrentDb.CreateQueryDef("") 
     qdf.Connect = connStr 
     qdf.SQL = "DELETE FROM [" & tbd.Name & "]" 
     qdf.ReturnsRecords = False 
     qdf.Execute 
     Set qdf = Nothing 
     CurrentDb.Execute _ 
       "INSERT INTO [" & connStr & "].[" & tbd.Name & "] " & _ 
       "SELECT * " & _ 
       "FROM [" & tbd.Name & "] ", _ 
       dbFailOnError 
    End If 
Next 
Set tbd = Nothing 
Debug.Print "Done." 
End Function