恢复 sql 数据库 C# 时未找到方法

Method not Found while restoring sql database C#

这是我正在处理的代码示例,主要问题是当 运行 在装有 SQL 服务器的 PC 上 运行 时,我无法 运行 恢复操作客户端 10.0.0.0。进程在此行崩​​溃:

DataTable logicalRestoreFiles = res.ReadFileList(myServer);

抛出的异常是:

Method not found Microsoft.SqlServer.Managment.Common.ServerConnection.GetDatabaseConnection(System.String)

只有当我尝试在装有 SQL Server 2008 R2 的 PC 上 运行 此代码时才会出现此问题。我在 SQL Server 2017 上试过了,数据库恢复没有问题。我真的需要一些帮助,我没主意了。

以下是当前的连接包及其版本,希望对您有所帮助:

 <package id="Microsoft.Data.ConnectionUI" version="16.4.29519.181" targetFramework="net461" />
 <package id="Microsoft.Data.Tools.Sql.BatchParser" version="150.18097.0-xplat" 
  targetFramework="net461" />
 <package id="Microsoft.SqlServer.ConnectionInfo" version="150.18097.0-xplat" 
  targetFramework="net461" />
 <package id="Microsoft.SqlServer.ConnectionInfo.dll" version="1.0.1" targetFramework="net461" />
 <package id="Microsoft.SqlServer.Management.Sdk.Sfc.dll" version="1.0.1" targetFramework="net461" 
  />
 <package id="Microsoft.SqlServer.Smo.dll" version="1.0.1" targetFramework="net461" />
 <package id="Microsoft.SqlServer.SmoExtended.dll" version="1.0.1" targetFramework="net461" />
 <package id="Microsoft.SqlServer.SqlEnum.dll" version="1.0.1" targetFramework="net461" />
 <package id="System.Data.SqlClient" version="4.4.0" targetFramework="net461" />

public void RestoreDatabase(string DBName)
{
    ServerConnection connection = new ServerConnection(txtServidor.Text, txtUsuario.Text, txtContraseña.Text);
    Server myServer = new Server(connection);            

    Restore res = new Restore();
    res.Database = DBName;
    res.Action = RestoreActionType.Database;
    res.Devices.AddDevice(ConfigurationManager.AppSettings.Get("bakPathToFile"), DeviceType.File);            
    res.PercentCompleteNotification = 10;
    res.ReplaceDatabase = true;
    res.PercentComplete += new PercentCompleteEventHandler(res_PercentComplete);

    try
    {
        bool logicalNamesRetrieved = false;
        string mdfFile = "";
        string logFile = "";

        var Response = EnviarComando("SELECT top 1 physical_name FROM sys.database_files");

        if (Response.Success)
        {
            mdfFile = CommandContent.Replace("master.mdf",_databasename+".mdf");
            logFile = CommandContent.Replace("master.mdf", _databasename + "_Log.ldf");
        }

        if(String.IsNullOrEmpty(mdfFile) || String.IsNullOrEmpty(logFile))
        {
            Logger.WriteLog("Ocurrio un error al buscar la ruta del archivo mdf o ldf.","Error");
        }
        else
        {
            try
            {
                DataTable logicalRestoreFiles = res.ReadFileList(myServer);
                res.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), mdfFile));
                res.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFile));
                logicalNamesRetrieved = true;
            }
            catch (Exception ex)
            {
                Logger.WriteLog("Excepcion al buscar logical names de los archivos mdf y log "+ex.Message + ex.InnerException != null ?
                ex.InnerException.Message : "", "Error rutas");
            }
        }

        if(logicalNamesRetrieved) 
           res.SqlRestore(myServer);
    }
    catch (Exception ex)
    {
        Logger.WriteLog("Ocurrio un error al intentar restaurar la base de datos. " + ErrorMesage + ex.InnerException != null ?
        ex.InnerException.Message : "", "Error");
    }
}

您必须确保您 运行 所有 PC 上的 SMO 版本相同,即在这种情况下,您所在的任何地方都应安装 .NET 4.6.1 运行 您的 4.6.1 编译代码.

下载link: https://support.microsoft.com/en-us/help/3102436/the-net-framework-4-6-1-offline-installer-for-windows

此外,请注意 Microsoft 不再支持 SQL Server 2008 R2,因此我强烈建议您升级这些机器。

我将 post 此处解决消失的 GetDatabaseConnection 问题的替代解决方案,以防其他人遇到神秘错误。我在将工作 VB.Net 项目从 .Net Framework 4.0 升级到 4.8 后遇到了它,这两个项目都针对同一个盒子上的 SQL Server 2014 实例。

我只是在属性 Window 中发现 dll 的运行时版本 O.P 后才修复此问题。链接到,如Microsoft.SqlServer.ConnectionInfo、SqlServer.Smo、SqlServer.SmoExtended、SqlEnum和SqlClient,均设置为v2.0.50727.

在我将 SMO dll 升级到最新版本(2020 年 9 月 30 日)后,所有这些文件的运行时版本都更改为 v4.0.30319 Microsoft.SqlServer.SqlManagementObjects Nuget 包及其依赖项。这之后,GetDatabaseConnection方法又出现了。

希望这会让其他人避免同样的试错过程,这涉及许多基于杂耍 .Net Framework 版本、文件引用、Nuget 包和其他类似的陷入“DLL 地狱”的失败解决方法。