我正在尝试返回数据库的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
我做错了什么?
答案 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;
}