В настоящее время я создаю динамические пакеты служб SSIS, которые импортируют / экспортируют и получают доступ к данным между SQL Server и несколькими файлами БД Access. (Jet файлы, если вы хотите получить технический.)
В любом случае, все успешно во время тестирования, пока мои пакеты служб SSIS имеют жестко запрограммированные строки подключения к файлу Access. Это здорово и отлично работает. Я доволен этим.
Проблема теперь начинается, когда я изменяю свое приложение VB.NET на использование строк динамического соединения с файлом БД Access (конечный файл, в который будут помещены данные). У меня есть файл Access DB, хранящийся в моем приложении как «встроенный ресурс».
Вот код, который я использую для создания файла назначения доступа:
Public Sub CreateDestinationFile(ByVal path As String)
'Create destination file from embedded project resources
Dim asm = System.Reflection.Assembly.GetExecutingAssembly()
Dim objStream As System.IO.Stream = asm.GetManifestResourceStream("XXX.XXX_Export.mdb")
Dim abytResource(objStream.Length) As [Byte]
Dim intLength As Integer = objStream.Read(abytResource, 0, objStream.Length)
Dim objFileStream = New FileStream(path + "XXX_Export.mdb", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)
Try
While intLength > 0
'write filestream to create Access DB file
objFileStream.Write(abytResource, 0, Convert.ToInt32(objStream.Length))
intLength = objStream.Read(abytResource, 0, objStream.Length)
End While
'close the file stream
objFileStream.Close()
Catch ex As Exception
'write error log here - ** omitted
Finally
asm = Nothing
objStream = Nothing
objFileStream = Nothing
End Try
End Sub
Это прекрасно работает и дает правильные результаты, файл БД Access, где бы я ни указывал путь. Это хорошо работает, когда мои пакеты служб SSIS имеют жестко закодированные строки подключения.
как только я изменяю строки подключения, чтобы они были динамическими, и повторно запускаю тот же самый точный тест, я получаю эту ошибку:
"Записи не могут быть прочитаны; нет прав на чтение для MSysAccessObjects"
Мое регулярное выражение строки подключения в моем пакете служб SSIS выглядит следующим образом:
--SQL connection string
"Data Source=" + @[User::sourceDatabaseLocation] + ";User ID=" + @[User::sourceDBUserID] + ";Password=" + @[User::sourceDBPassword] + ";Initial Catalog=" + @[User::sourceDBName] + ";Provider=SQLOLEDB.1;Persist Security Info=True;Auto Translate=False;"
--Access connection string
"Data Source=" + @[User::destinationDatabasePath] + ";Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Password=;"
Когда я перехожу к этому файлу на своем локальном жестком диске и пытаюсь открыть его, он подсказывает мне, что он находится в неисправимом состоянии и восстанавливает его, чего он никогда не делал.
- Я что-то упускаю из виду при создании моего файла? (IO?)
- Я что-то пропускаю в отношении встроенных ресурсов?
(мне они кажутся довольно простыми, но, может быть, я упускаю из виду нечто очевидное?)
- Состояние моего файла повреждено? Я могу открыть его в VS.NET IDE и локально, с помощью MS Access.
- Стоит ли воссоздавать этот файл Access? Я читал, что вы можете скопировать схему в новый файл, чтобы избежать ремонта? Это звучит так рискованно !!
Первоначально я думал, что это ошибка разрешения, касающаяся роли пользователя в файле БД Access и попыток SSIS его использовать. Но я не думаю, что это так. Пользователь настроен на Admin и должен (теоретически) работать.
Я думаю, что для взлома / исправления я сейчас попытаюсь НЕ использовать встроенные ресурсы. Я буду использовать вызовы FileIO, чтобы явно переместить файл в нужную папку и заполнить его оттуда. Кто-нибудь знает, почему файл базы данных встроенного ресурса не будет работать, но тот же файл работает, если он не создан из встроенного ресурса? Есть ли что-то, что не завершается, когда я создаю свой файл из ресурса?
Любые отзывы и предложения приветствуются. Любые вопросы тоже приветствуются. Спасибо.
**** Обновление / 18.07.2009: **
Я изменил свою подпрограмму [CreateDestinationFile] для выполнения прямого копирования файла / ввода-вывода вместо использования встроенного ресурса.
Вот код для этого:
Dim sPath As String = My.Application.Info.DirectoryPath + "\databasenamehere.mdb"
FileIO.FileSystem.CopyFile(sPath, path + "databasenamehere.mdb", True)
Файл правильно скопирован из проекта, но теперь я получаю эту ошибку:
"Произошла ошибка OLE DB. Код ошибки: 0x80040E09. Доступна запись OLE DB. Источник:" Microsoft JET Database Engine "Hresult: 0x80040E09 Описание:" Запись (и) не может быть прочитана; нет разрешения на чтение для TABLE_XXXXX. "
Это заставляет меня поверить, что SSIS не имеет надлежащих разрешений для использования моей локальной базы данных MS Access в качестве файла назначения.
Это странно для меня, потому что тот же файл работает, если я жестко закодировал строку подключения к нему в моем пакете служб SSIS. Что здесь происходит?
Как вы можете видеть в моих выражениях строки подключения, я имею [Admin] в качестве пользователя. Так что это должно работать, верно? Кроме того, еще одним возможным виновником этой проблемы является тот факт, что это устаревшая БД MS Access, созданная в Access 2003, и я использую Access 2007 на своем компьютере. Помощь