【问题标题】:Method not Found while restoring sql database C#恢复sql数据库C#时找不到方法
【发布时间】:2019-12-31 12:42:09
【问题描述】:

这是我正在处理的代码示例,主要问题是在使用 SQL Server 客户端 10.0.0.0 的 PC 上运行时,我无法运行还原操作。进程在这一行崩溃:

DataTable logicalRestoreFiles = res.ReadFileList(myServer);

抛出的异常是:

找不到方法 Microsoft.SqlServer.Managment.Common.ServerConnection.GetDatabaseConnection(System.String)

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

以下是当前的 Connection 包及其版本,以防万一:

 <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");
    }
}

【问题讨论】:

  • 什么是还原类?你自己的类或一些包
  • @Gauravsa:很可能是 SMO(SQL Server 管理对象)库中的类

标签: c# sql-server database restore .net-4.6.1


【解决方案1】:

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

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

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

【讨论】:

  • 嗨!新年快乐,是的,我仔细检查了目标电脑安装了.net framework 4.6.1,版本相同。问题可能出在其他地方吗?或者我是不是用错了方法?感谢您的回答
  • 在这种情况下,由于某种原因,看起来目标电脑上仍然加载了错误版本的 SMO dll。您可以使用docs.microsoft.com/en-us/sysinternals/downloads/procmon 来确定准确加载的内容。或者(根据我的经验,这在某些情况下被证明是一个非常快速和肮脏但有效的解决方案)您可以在目标 PC 上安装最新的 SQL Server Management Studio,因为它包含许多所需的 SMO 参考。但如上所述,这是一个相当丑陋的解决方案,所以我建议你先用 procmon 进行调查。
  • 有没有办法配置我的应用程序以使用我引用的 smo 版本。并且不使用安装在目标电脑上的那个?
【解决方案2】:

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

我在“属性”窗口中发现 OP 链接到的 dll 的运行时版本(例如 Microsoft.SqlServer.ConnectionInfo、SqlServer.Smo、SqlServer.SmoExtended、SqlEnum 和 SqlClient)都设置为 v2 后才修复此问题.0.50727.

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

希望这将使其他人免于经历相同的试错过程,其中涉及许多失败的变通办法,这些变通办法基于将 .Net Framework 版本、文件引用、Nuget 包和其他类似的陷入“DLL 地狱”的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多