SQL SMO:كيفية الحصول على مسار اسم الملف الفعلي لقاعدة البيانات؟

StackOverflow https://stackoverflow.com/questions/474498

  •  19-08-2019
  •  | 
  •  

سؤال

أحاول إرجاع مسار الملف الفعلي لملفات 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

ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

عادة ما تكون المشكلة هي أن خاصية DefaultFile فارغة.ملف البيانات الافتراضي هو المكان الذي يتم فيه تخزين ملفات البيانات على مثيل SQL Server ما لم يتم تحديد خلاف ذلك في خاصية FileName.إذا لم يتم تحديد موقع افتراضي آخر، فسوف تقوم الخاصية بإرجاع سلسلة فارغة.

لذلك، هذه الخاصية لا تعيد أي شيء (سلسلة فارغة) إذا لم تقم بتعيين الموقع الافتراضي.

الحل البديل هو التحقق من خاصية DefaultFile، إذا قامت بإرجاع سلسلة فارغة، استخدم SMO للحصول على قاعدة البيانات الرئيسية، ثم استخدم خاصية Database.PrimaryFilePath لاسترداد موقع ملف البيانات الافتراضي (نظرًا لأنه لم يتغير)

بما أنك تقول أن المشكلة تتعلق بـ PrimaryFilePath:

  • تأكد من أن اتصالك مفتوح
  • التأكد من توفر خصائص أخرى

نصائح أخرى

وهذا هو كيف أفعل ذلك، أعدت لأسماء الملفات المتعددة. 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;
}

وSRV خادم = Server جديد (اتصال)؛ DatabaseCollection DBC = svr.Databases. قاعدة بيانات قاعدة بيانات = DBC [ "DBNAME"]؛ سلسلة أسم دليل = database.PrimaryFilePath؛

وأعتقد أن نهج أسهل أن تكون لتشغيل البرنامج النصي SQL على سبيل المثال SQL Server الخاص بك الذي سوف دائما نعود لكم البيانات الصحيحة وتسجيل مسارات الملفات. سوف 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.

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top