現在、SQLServerといくつかのAccessDBファイル間でデータをインポート/エクスポートおよびアクセスする動的SSISパッケージを作成しています。(技術的になりたい場合はファイルをジェットします。)
とにかく、私のSSISパッケージにAccessファイルへの接続文字列がハードコードされている限り、テスト中はすべてが成功します。これは素晴らしく、うまく機能します。私はこれに満足しています。
この問題は、Access DBファイル(データが配置される宛先ファイル)への動的接続文字列を使用するようにVB.NETアプリケーションを変更したときに始まります。AccessDBファイルを「埋め込みリソース」としてアプリケーションに保存しています。
アクセス先ファイルの作成に使用するコードは次のとおりです。
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
これは正常に機能し、パスを指定する場所にアクセスDBファイルという正しい結果を生成します。これは、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で、MSAccessを使用してローカルで開くことができます。
- このAccessファイルを再作成する価値はありますか?修復を回避するためにスキーマを新しいファイルにコピーできることを読みましたか?これはすごい危険に聞こえます!!
もともと、Access DBファイルのユーザーロールとそれを使おうとしているSSISに関して、これはパーミッションエラーだと思っていました。しかし、それだけではないと思います。ユーザーはAdminに設定されており、(理論的には)機能するはずです。
私はこれをハック/修正すると思います。現在、埋め込みリソースを使用しないようにしています。FileIO呼び出しを使用して、ファイルを目的のフォルダーに明示的に移動し、そこからデータを入力します。埋め込みリソースのdbファイルが機能しない理由を誰かが知っていますが、埋め込みリソースから作成されていない場合、同じファイルは機能しますか?リソースからファイルを作成するときに完了していないものはありますか?
フィードバックや提案は大歓迎です。ご不明な点も大歓迎です。ありがとうございました。
****更新/2009年7月18日:**
[CreateDestinationFile]ルーチンを変更して、埋め込みリソースを使用する代わりに、ファイル/IOの直接コピーを実行しました。
そのためのコードは次のとおりです。
Dim sPath As String = My.Application.Info.DirectoryPath + "\databasenamehere.mdb"
FileIO.FileSystem.CopyFile(sPath, path + "databasenamehere.mdb", True)
ファイルはプロジェクトから正しくコピーされていますが、次のエラーが発生します。
"OLE DBエラーが発生しました。エラーコード:0x80040E09。OLEDBレコードが使用可能です。ソース:" MicrosoftJETデータベースエンジン"Hresult:0x80040E09説明:"レコードを読み取ることができません。'TABLE_XXXXX'の読み取り権限はありません。」
これにより、SSISにはローカルのMSAccessDBを宛先ファイルとして使用するための適切なアクセス許可がないと思われます。
SSISパッケージに接続文字列をハードコーディングすると同じファイルが機能するため、これは私には奇妙です。ここで何が起こっているのですか?
接続文字列式でわかるように、ユーザーとして[Admin]があります。だからこれはうまくいくはずですよね?また、この問題のもう1つの考えられる原因は、これがAccess2003で作成されたレガシーMSAccess DBであり、ボックスでAccess2007を使用しているという事実です。ヘルプ?