Sql SMO:如何获取数据库物理文件名的路径?

时间:2009-01-23 20:59:59

标签: sql-server smo

我正在尝试返回数据库的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:\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL

我做错了什么?

5 个答案:

答案 0 :(得分:5)

通常问题是DefaultFile属性为null。除非FileName属性中另有指定,否则缺省数据文件是数据文件存储在SQL Server实例上的位置。如果未指定其他默认位置,则属性将返回空字符串。

因此,如果未设置默认位置,则此属性不会返回任何内容(空字符串)。

解决方法是检查DefaultFile属性,如果它返回空字符串,则使用SMO获取master数据库,然后使用Database.PrimaryFilePath属性检索默认数据文件位置(因为它没有更改)

因为您说问题与您的PrimaryFilePath有关:

  • 确认您的连接已打开
  • 确认其他属性可用

答案 1 :(得分: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;
}

答案 2 :(得分:0)

服务器srv =新服务器(连接); DatabaseCollection dbc = svr.Databases; 数据库database = dbc [“dbName”]; string filePath = database.PrimaryFilePath;

答案 3 :(得分: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;

如果您将使用此代码段,请确保创建一个DatabaseInfo类,该类将存储从Sql server实例返回的信息。

答案 4 :(得分:0)

using Smo = Microsoft.SqlServer.Management.Smo;

public string GetDataBasePath(string strDatabaseName)
{
    ServerConnection srvConn = new ServerConnection();
    srvConn.ConnectionString = "<your connection string goes here>";
    Server srv = new Server(srvConn);

    foreach (Smo.Database db in srv.Databases)
    {
        if (string.Compare(strDatabaseName, db.Name, true) == 0)
        {
            return db.PrimaryFilePath;
        }
    }

    return string.Empty;
}