2019年1月5日土曜日

VB LocalDB ファイル操作 続編

以前、 LocalDB のファイルを扱う上で、利用中の Project から  process Kill する方法を書きました。
勿論、これでも、目的は達成可能ですが、もっとスマートに。
LocalDB を利用する Form から、
その instance を stop する 方法 です。


基本的に、自分の Form では、どの instance を使って、
msd File を Open しているかは分かっている筈なので、
その instance を stop すれば良いでしょう。

cmd.exe から起動出来る sqllocaldb.exe を使います。
instance 全ての名称取得は sqllocaldb i ですし、
MSSQLLocalDB instance を止めるなら、 sqllocaldb stop "MSSQLLocalDB" です。
ProjectsV13 instance を止めるなら、 sqllocaldb stop "ProjectsV13"  です。
これを プログラムから 別 Process で走らせれば良いのでしょう。


以前の投稿でも書いたのですが、
実際に、利用が終わって、Form が閉じられても、
10分程度は、待機状態で、LocalDB は残っています。

   VB LocalDB とファイル操作 1-2
   VB LocalDB とファイル操作 1-2

この間に、mdf File を操作しようとしても、
限定的になってしまいます。

例えば、IDE で Server Explorer から接続し、直ぐに、F5 or Ctrl+F5 で .exe 実行すると、
File が Lockされていると怒られてしまいます。

System.Data.SqlClient.SqlException: 'Cannot open database "C:\...\xxx.MDF" requested by the login. The login failed.
Login failed for user 'Machine\UserA'.'

同じ instance ですが、別の 親 がハンドルをキープしている訳ですね。  ? ですが。.
この場合は、Server Explorer から接続を切れば、良いのでしたね。


しかし、 VS IDE で自動生成されたコードは、
接続も自動なので、簡単には行きません。
任意切断の部分は賄ってくれないのです。
通常は、そんな事は気にしなくて良い仕組みになっているからでしょう。


そう、 実行中のプログラムの中からは、難しいのでしたね。
そこで、前回は、 Process を Kill すると言う暴挙に出た訳です。
ファイルを操作する為にです。  ファイル操作とは、詰まり、コピーやバックアップ目的です。

そんな 危ない橋 を渡らなく共、 Command Line Utility の sqllocaldb.exe から、
同様の操作が可能だった訳です。


参考迄に、
Label に 事前に取得した Instance 名 を格納した状態で、
その Instance を止める関数の例を。  VB.nert です。

    Private Function StopLocalDB() As String
        Dim psi As New System.Diagnostics.ProcessStartInfo()
        psi.FileName = "cmd.exe"
        psi.Arguments = "/C sqllocaldb stop """ & Me.Label414.Text & """"
        psi.UseShellExecute = False
        psi.RedirectStandardOutput = True
        psi.RedirectStandardInput = False
        psi.CreateNoWindow = True
        Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
        Dim results As String = p.StandardOutput.ReadToEnd()
        p.WaitForExit()
        p.Close()
        Return results
    End Function

この関数は プロンプト を取り込み、戻り値として返しますので、
別途用意した Label 或いは TextBox に結果を表示させます。
無事に処理が終われば、
LocalDB instance "xxxxx" stopped.
と、画面表示される仕組みです。
言い換えれば、 この表示が出る迄は、ファイル操作は 待ってね! 状態 です。

更に、
こうして、止めた Instance ですが、
VS IDE  が自動生成するコードは、 再接続を、態々、考慮しなく共、
何も無かったかの如く、 必要に応じて、再び、Instance を起動し、動いてくれます。

そう、 停止 は、上記の例の様に、何か書く必要がありますが、
再開・ 再起動 は何もする必要はありません。

何時もの通り、 最低限のコードで、例外処理も最低限です。  :) .



追記

実は、接続文字列から Instance 名を取得して実行させる前提なので、
Standard Error は吐かれません。  大抵は、件のメッセージが返るのみ です。
もし、Instance 名を任意にする場合、この例外 (Standard Error) に対応する必要があります。
或いは、存在する Instance 群 と それ(任意)とを 突き合わせる 必要があります。 .



0 件のコメント:

コメントを投稿