現在、SQL Serverと複数のAccess DBファイル間でデータをインポート/エクスポートしてアクセスする動的SSISパッケージを作成しています。.NETのアクセス許可の問題を読み取ります。埋め込みリソース - DBファイルとSSISにアクセスします。
とにかく、SSISパッケージにAccessファイルへのハードコードされた接続文字列がある限り、テスト中にすべて成功します。これは素晴らしいことであり、うまく動作します。私はこれに満足しています。
この問題は、Accessデータベースファイル(データが配置される宛先ファイル)に動的接続文字列を使用するようにVB.NETアプリケーションを変更するときに開始されます。私はアクセス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
これは正常に動作し、それは私がへのパスを提供どこでも、アクセスDBファイルを、正しい結果を生成します:ここで
は、私は私のアクセス先ファイルを作成するために使用するコードです。これは、SSISパッケージにハードコードされた接続文字列がある場合にうまく機能します。
私は動的にする接続文字列を変更し、再実行し、同じ正確検定たら、私はこのエラーを取得する:私のSSISパッケージの
"Record(s) cannot be read; no read permission on 'MSysAccessObjects'"
私の接続文字列の正規表現は次のようになります。
--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ファイルを再作成する価値はありますか?修復を避けるためにスキーマを新しいファイルにコピーできることをお読みください。これはSOOOOOを危険に陥らせる!!
元は、これは、Access DBファイルとそれを使用しようとしているSSISのユーザー役割に関して、これは許可エラーと思っていました。しかし、私はそれがそれだとは思わない。ユーザーは管理者に設定されており、(理論上)動作するはずです。
私は現在、組み込みリソースを使用しないようにしようとしています。 FileIO呼び出しを使用して、ファイルを明示的に目的のフォルダに移動し、そこからファイルを読み込みます。誰も埋め込みリソースdbファイルが動作しない理由を知っていますか?埋め込みリソースから生成されない場合、同じファイルが動作しますか?リソースからファイルを作成するときに完了していないことはありますか?
ご意見やご提案をいただければ幸いです。どんな質問も歓迎されます。ありがとうございました。
****アップデート//2009分の18 07:**
私が代わりに埋め込まれたリソースを使用するのではなく、直接ファイル/ IOのコピーを実行するために私の[CreateDestinationFile]ルーチンを変更しました。ここで
はそのためのコードです: Dim sPath As String = My.Application.Info.DirectoryPath + "\databasenamehere.mdb"
FileIO.FileSystem.CopyFile(sPath, path + "databasenamehere.mdb", True)
ファイルが正しくプロジェクトからコピーされたが、私は今、このエラーが表示されます。
"An OLE DB error has occurred. Error code: 0x80040E09. An OLE DB record is available. Source: "Microsoft JET Database Engine" Hresult: 0x80040E09 Description: "Record(s) cannot be read; no read permission on 'TABLE_XXXXX'."
これは、SSISにはないと信じて私をリードします私のローカルMS Access DBを宛先ファイルとして使用するための適切な権限を持っています。
SSISパッケージで接続文字列をハードコードすると、同じファイルが機能するため、これは私にとっては奇妙です。ここで何が起こっているのですか?
私の接続文字列の表現でわかるように、私は[Admin]をユーザとして持っています。これはうまくいくはずですよね?また、この問題のもう一つの原因は、これがAccess 2003で作成されたレガシーMS Accessデータベースであり、私のボックスでAccess 2007を使用しているということです。助けて?
私はこの例がC#.NETでは謝罪していません。 VB.NETは私の最初の選択肢の.NET言語ではありません。 – D3vtr0n