2009-07-15 19 views
0

現在、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=;" 

ローカルのハードドライブでこのファイルに移動して開こうとすると、修復不可能な状態になっていることを確認するメッセージが表示され、正常に修復されません。

  1. 私はファイル作成に関する何かを見落としていますか? (IO?)
  2. 私は組み込みリソースに関する何かを見落としていますか? (私にとってはまっすぐに見えますが、明らかに何かを見落としているかもしれません)
  3. ファイルの状態は破損していますか?私はVS.NET IDEとローカルで、MS Accessで開くことができます。
  4. この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を使用しているということです。助けて?

答えて

0

この問題を解決するために、最初のプロジェクトの収集中に私に提供されたテンプレートファイルを使用しました。

私が扱っていた.mdbファイルは、数多くのアプリケーションやテストプロジェクトに対して開発され、テストされていました。このファイルは、1日目以降問題となっています。

私の最初の問題は、ファイルサイズが80 mbだったことです。これは私には非常に奇妙なものでした。その中にはデータがほとんどないからです。 「圧縮と修復」が必要であることが分かったら、サイズを200 kbより小さくしました。これは私を困惑させた。しかし、私はこのファイルを引き続き開発のために使用し続けました。今は大きなノー・ノーでした。

私はこのプロジェクトを継承したときに、元の.mdbファイルを自分の電子メールから掘り起こすことにしました。このオリジナルの.mdbは、エクスポートしているテーブルにそのデータが含まれているため、まだ理想的ではありません。手動で何千ものレコードを削除しなければならなかった。私がそれをしたら、私のSSISパッケージは魔法のように働いた。私は今、SQLからAccessにデータを動的にエクスポートできます。ここで

は[app.configを]設定ファイルが提供する、動的な接続文字列を使用してSSISパッケージの私のVB.NETの実行です:

Public Function ExecuteSSISExportPackage(ByVal parameterValue1 As String, ByVal destinationDatabasePath As String) As Integer 

    Dim pkg As New Package 
    Dim app As New Microsoft.SqlServer.Dts.Runtime.Application 
    Dim pkgResults As DTSExecResult 
    Dim result As Integer = 1 'defaults to failure 
    Dim eventListener As New EventListener() 

    'create SSIS variables for dynamic parameters, retrieved from the appSettings in the [app.config] file 
    Dim SSISPackagePassword As String = ConfigurationManager.AppSettings.Item("SSISPackagePassword") 
    Dim SSISExportPackagePath As String = ConfigurationManager.AppSettings.Item("SSISExportPackagePath") 
    Dim SSISExportPackageServerName As String = ConfigurationManager.AppSettings.Item("SSISExportPackageServerName") 
    Dim SSISExportPackageServerUserName As String = ConfigurationManager.AppSettings.Item("SSISExportPackageServerUserName") 
    Dim SSISExportPackageServerPassword As String = ConfigurationManager.AppSettings.Item("SSISExportPackageServerPassword") 
    Dim SSISExportPackageDestinationDBName As String = ConfigurationManager.AppSettings.Item("SSISExportPackageDestinationDBName") 

    Try 
     'set package password 
     app.PackagePassword = SSISPackagePassword 
     pkg.PackagePassword = SSISPackagePassword 

     'load package from SQL server 
     pkg = app.LoadFromSqlServer(SSISExportPackagePath, SSISExportPackageServerName, SSISExportPackageServerUserName, SSISExportPackageServerPassword, eventListener) 

     'set package-level variables, to supply to the stored procedure parameters/sql calls in the SSIS Export package 
     pkg.Variables("xxxx").Value = parameterValue1 

     'set the package-level variable to supply the Access DB's (SSIS destination) file path 
     Dim databaseName As String = ConfigurationManager.AppSettings.Item("XXXClientDatabaseName") 
     pkg.Variables("destinationDatabasePath").Value = "C:\" + databaseName 

     'Dynamic SQL source connection string values 
     pkg.Variables("sourceDatabaseLocation").Value = SSISExportPackageServerName 
     pkg.Variables("sourceDBUserID").Value = SSISExportPackageServerUserName 
     pkg.Variables("sourceDBName").Value = SSISExportPackageDestinationDBName 
     pkg.Variables("sourceDBPassword").Value = SSISExportPackageServerPassword 

     'Execute the Import SSIS package, add an eventListener object for SSIS reflection 
     pkgResults = pkg.Execute(Nothing, Nothing, eventListener, Nothing, Nothing) 

     'Package execution results 
     Select Case pkgResults 

      Case DTSExecResult.Success 
       result = 0 

      Case DTSExecResult.Failure 
       result = 1 

     End Select 

    Catch ex As Exception 

     'Log the exception error here - omitted 

    Finally 
     app = Nothing 
     pkg = Nothing 
    End Try 

    Return result 

End Function 
+0

私はこの例がC#.NETでは謝罪していません。 VB.NETは私の最初の選択肢の.NET言語ではありません。 – D3vtr0n

0

これはひどく役に立ちそうな答えではありません。あなたが作業している環境では動作しませんので、これを行う必要はありませんが、いくつか考えています。

adminをデフォルトのJetログオンであるユーザーと空白のパスワードとして使用していますが、誤ったワークグループファイルを使用している可能性があります。接続文字列にワークグループファイル引数がない特定のメソッドによってJetファイルに接続する際に問題が発生する他のStackOverflowポスターを思い出してください。 ODBC DSNを作成して接続しようとしましたか? DSNを使用すると、問題を改善できるようにワークグループファイルを指定できます。その後、結果として得られる接続文字列をDSNレス接続文字列に変換して、それをパラメータ化された接続文字列のモデルとして使用することができます。

+0

ご回答いただきありがとうございます。私はこの問題を解決するために多くのアプローチで悩んだ。あなたの返信は、実際に私に接続文字列パラメータを近づけさせましたが、残念ながら何も成功しませんでした。私のデータベースは壊れていて、これが私の問題でした。私はその中のすべてのデータを見ることはできますが、それは壊れていましたが肉眼では見えませんでした。助けてくれてありがとう、それは私が思っていなかった方向で私の心を開いた。乾杯。 – D3vtr0n

+0

元の質問を更新して、破損を修正した問題を解決したことを反映させるべきでしょう。 –

関連する問題