0

最新バージョンかどうかを確認するアプリケーションがあります。File.Copyそうでない場合は、アプリケーションに接続されている DB を新しいもの (変更されている場合とされていない場合があります) に置き換えるために使用して、それ自体を更新します。データが削除されないようにするために、データベースが削除される前にすべてのデータを XML ファイルに書き込み、データベースがコピーされたらデータを復元するバックアップ システムを作成しました。

ただし、別のプロセスで使用されているFile.Copyことを示すエラーがポップアップ表示されるという点で、メソッドに問題があります。.MDF

SQL Server を停止するとうまくいくと言われましたが、うまくいきませんでした。また、SMO を使用できると言われましたが、それを機能させることもできませんでした。これが完成に近づいているように見えるので、SMO も必要ないように思われます。

私のコードはこれです:

'This is the backup. I make sure to close the SQL Connection when the process is complete.

        Dim db As String = "C:\ACE DB\localACETest.mdf"
        Dim dbLog As String = "C:\ACE DB\localACETest_log.ldf"

        If File.Exists(db) = True Then
              'Backup process
              '...
        End If


       '"Data/localACETest.mdf" referenced below is the file located inside of my application that is used to overwrite the other MDF; it is NOT the .MDF I'm looking to replace.

       Directory.CreateDirectory("C:\Random Directory\")
       File.Copy("Data/localACETest.mdf", db, True) 'This is the line where I get the error
       File.Copy("Data/localACETest_log.ldf", dbLog, True)
       success = False
       ...

編集: 問題をデータをバックアップする方法に絞り込みました。次の接続文字列を使用しています。

Private Const _sqlDB As String = "Data Source=(localdb)\v11.0;Initial Catalog=localACETest;Integrated Security=True; _
AttachDbFileName=C:\ACE DB\localACETest.mdf"

SQL を開き、コマンドを実行してから閉じます。

Using connection = New SqlConnection(_sqlDB)
            connection.Open()
            ...
            connection.close()

プロセスから MDF が解放されないのはなぜですか? (走らなければ問題ない)

4

1 に答える 1

0

コマンドをSQLサーバーに送信して、バックアップを作成するように指示することをお勧めします。この SO 記事には、コピーして貼り付けることができる優れた (コマンド ライン) スクリプトがあります: SQL Server コマンド ライン バックアップ ステートメント

それをバッチに入れて、このように起動します。

System.Diagnostics.Process.Start("C:\Ace Db\MakeADBBackup.bat")

バックアップが完了するまでプログラムを待機させたい場合は、起動プロセスについてお読みください: http://support.microsoft.com/kb/305368


どうしても .mdf のコピーを作成することに固執する場合 (これは良い考えではありません)、コピーを作成する前にサーバーに SQL サービスを停止するように依頼する必要があります。次のバッチを実行できます

NET STOP MSSQLSERVER

SQL Server が「MSSQLSERVER」という名前で実行されていると仮定します。実行中のサービスの名前を確認するには、コマンド プロンプトを開き、「NET START」と入力します。実行中のサービスのリストが表示されます。それらの 1 つは、SQL Server の実行中のサービスの「プロセス名」になります。

さらに良いことに、SQL Server を起動/停止するためのソース コードを示す記事 (VB.NET 用) があります。 http://msdn.microsoft.com/en-us/library/ms162139(v=SQL.90).aspx

私が提案した最初のアプローチを試すことを強くお勧めします。

于 2013-08-21T17:20:55.853 に答える