3

サーバー上でデータベースがどのドライブにあるかを調べようとしています。さらに詳しく説明すると、サーバー「MyServer」とそのサーバー上に 3 つのデータベースがあります。データベース A と B はそのサーバーの「C:\」ドライブにあり、データベース C は「D:\」ドライブにあります。接続文字列を使用してドライブ文字を取得する方法を知りたいので、ユーザーがアプリケーションからデータベースを選択すると、そのデータベースがどのドライブにあるのかがわかります。

現在、次の手段を試していますが、正しい応答が得られません。

Private void GetDriveLetter()
{
   string connectionString = String.Format(DatabaseInfo.CONNECTIONSTRING_TEMPLATE, dbName, server)
   try
   {
     using (SqlConnection cn = new SqlConnection(ConnectionString))
     {
       cn.Open();
       Server srv = new Server(new ServerConnection(cn));
       Database database = new Database(srv, dbName);
       txtDriveLetter.Text = database.PrimaryFilePath;
       cn.Close();
     }
    }
    catch (Exception ex)
    { 
      myException = ex.Message
    }
}

DatabaseInfo は、SQL Server とデータベース名を読み取るために使用する単なるクラスであり、myException はログ ファイルに例外を書き込む関数です。私が抱えている問題は、何をしても PrimaryFilePath が設定されていないという例外が発生することです。私は何か間違ったことをしている/何かが欠けているのでしょうか、それともこれは正しい方法ではありませんか?

編集: 申し訳ありませんが、例外を投稿したことはありません。このアクションを実行するには、PrimaryFilePath プロパティを設定します。

4

3 に答える 3

5

sysSQL Server 内のカタログ ビューに対していつでもクエリを実行できます。

SELECT * FROM sys.master_files

これにより、データベース、idその論理名、およびディスク上のファイルの場所が一覧表示されます。

于 2012-09-28T14:33:50.430 に答える
2

新しいデータベースを構築するのではなく、おそらく既存のデータベースにアクセスする必要があります。

Database database = srv.Databases[dbName];

(もちろん、名前が存在しない場合はエラー処理が必要です)。

また、もちろん、データベースは複数のファイルで構成されている場合があり、それらのファイルが異なるドライブにある場合があることに注意してください。

于 2012-09-28T14:33:54.503 に答える
0

これが SQL Server の場合は、次を使用できます。

SELECT * FROM sys.database_files

現在のデータベースのファイルを取得します。したがって、接続文字列は必要なデータベースに接続する必要があり、上記の SQL は、physical_name. そこからドライブ文字を抽出できます。

于 2012-09-28T14:37:07.450 に答える