Я пытаюсь вернуть физический путь к файлам 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: \ Программные файлы \ Microsoft SQL Server \ MSSQL.1 \ MSSQL

Что я делаю не так?

5
flayto 23 Янв 2009 в 23:59

5 ответов

Лучший ответ

Обычно проблема заключается в том, что свойство DefaultFile имеет значение null. Файл данных по умолчанию - это место, где файлы данных хранятся в экземпляре SQL Server, если иное не указано в свойстве FileName. Если другое расположение по умолчанию не указано, свойство вернет пустую строку.

Таким образом, это свойство ничего не возвращает (пустая строка), если вы не установили местоположение по умолчанию.

Обходной путь - проверить свойство DefaultFile, если оно возвращает пустую строку, используйте SMO для получения главной базы данных, а затем используйте свойство Database.PrimaryFilePath для получения местоположения файла данных по умолчанию (поскольку оно не изменилось)

Поскольку вы говорите, что проблема связана с вашим PrimaryFilePath:

  • Подтвердите, что ваше соединение открыто
  • Подтвердите, что доступны другие свойства
5
Noah 30 Янв 2009 в 21:31

Вот как я это делаю, подготовленный для нескольких имен файлов. Обратитесь к 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
flipdoubt 16 Июн 2009 в 18:44

Я думаю, что самым простым подходом было бы запустить sql-скрипт на вашем экземпляре 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

Вы все равно можете выполнить этот sql с помощью SMO, если хотите, который вернет вам набор данных, а затем вы сможете извлечь эту информацию.


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.

0
adeel41 22 Янв 2015 в 12:24

Сервер srv = новый Сервер (соединение); DatabaseCollection dbc = svr.Databases; База данных database = dbc ["dbName"]; строка filePath = database.PrimaryFilePath;

0
MikiMiki 9 Апр 2009 в 17:19
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;
}
0
Tunaki 27 Фев 2016 в 16:49