5

データベースのmdf/ldfファイルの物理ファイルパスを返そうとしています。

次のコードを使用してみました。

Server srv = new Server(connection);
Database database = new Database(srv, dbName);

string filePath = database.PrimaryFilePath;

ただし、これは例外をスローします "'database.PrimaryFilePath'はタイプ'Microsoft.SqlServer.Management.Smo.PropertyNotSetException'の例外をスローしました-これを実行しているデータベースが存在し、そのmdfファイルがc:\にある場合でもプログラムファイル\MicrosoftSQLServer\ MSSQL.1 \ MSSQL

私は何が間違っているのですか?

4

5 に答える 5

5

通常、問題は DefaultFile プロパティが null であることにあります。既定のデータ ファイルは、FileName プロパティで特に指定されていない限り、データ ファイルが SQL Server のインスタンスに格納される場所です。他のデフォルトの場所が指定されていない場合、プロパティは空の文字列を返します。

したがって、デフォルトの場所を設定していない場合、このプロパティは何も返しません (空の文字列)。

回避策は、DefaultFile プロパティを確認することです。空の文字列が返された場合は、SMO を使用してマスター データベースを取得し、Database.PrimaryFilePath プロパティを使用して既定のデータ ファイルの場所を取得します (変更されていないため)。

問題は PrimaryFilePath にあると言うので:

  • 接続が開いていることを確認する
  • 他のプロパティが利用可能であることを確認する
于 2009-01-23T21:20:49.157 に答える
2

これは、複数のファイル名に備えて、私が行う方法です。database.LogFiles にアクセスして、同じログ ファイル名のリストを取得します。

private static IList<string> _GetAttachedFileNames(Database database)
{
    var fileNames = new List<string>();

    foreach (FileGroup group in database.FileGroups)
        foreach (DataFile file in group.Files)
            fileNames.Add(file.FileName);

    return fileNames;
}
于 2009-06-16T14:44:46.440 に答える
0

サーバー srv = 新しいサーバー (接続); DatabaseCollection dbc = svr.Databases; データベース database = dbc["dbName"]; string filePath = database.PrimaryFilePath;

于 2009-04-09T13:19:16.157 に答える
0

最も簡単な方法は、SQL Server インスタンスで SQL スクリプトを実行することだと思います。これにより、常に正しいデータとログ ファイルのパスが返されます。次のSQLはそのトリックを行います


SELECT
    db.name AS DBName,
    (select mf.Physical_Name FROM sys.master_files mf where mf.type_desc = 'ROWS' and db.database_id = mf.database_id ) as DataFile,
    (select mf.Physical_Name FROM sys.master_files mf where mf.type_desc = 'LOG' and db.database_id = mf.database_id ) as LogFile
FROM sys.databases db
order by DBName

必要に応じて、SMO を使用してこの SQL を実行することもできます。これにより、データセットが返され、その情報を抽出できます。


var result = new List();
            var server = new Server( serverInstanceName );
            var data = server.Databases[ "master" ].ExecuteWithResults(sql);

            foreach ( DataRow row in data.Tables[ 0 ].Rows )
                result.Add( new DatabaseInfo( row[ "DBName" ].ToString(), row[ "DataFile" ].ToString(), row[ "LogFile" ].ToString() ) );

            return result;

このスニペットを使用する場合は、Sql サーバー インスタンスから返された情報を格納する DatabaseInfo クラスを必ず作成してください。

于 2015-01-22T09:24:24.017 に答える