Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 还原sql数据库C时找不到方法_C#_Sql Server_Database_Restore_.net 4.6.1 - Fatal编程技术网

C# 还原sql数据库C时找不到方法

C# 还原sql数据库C时找不到方法,c#,sql-server,database,restore,.net-4.6.1,C#,Sql Server,Database,Restore,.net 4.6.1,这是我正在处理的代码示例,主要问题是在装有SQL Server client 10.0.0.0的PC上运行时无法运行还原操作。进程在此行上崩溃: DataTable logicalRestoreFiles = res.ReadFileList(myServer); 引发的异常是: 找不到方法Microsoft.SqlServer.Management.Common.ServerConnection.GetDatabaseConnectionSystem.String 只有当我尝试在装有SQL

这是我正在处理的代码示例,主要问题是在装有SQL Server client 10.0.0.0的PC上运行时无法运行还原操作。进程在此行上崩溃:

DataTable logicalRestoreFiles = res.ReadFileList(myServer);
引发的异常是:

找不到方法Microsoft.SqlServer.Management.Common.ServerConnection.GetDatabaseConnectionSystem.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版本,即在本例中,运行4.6.1编译代码的任何地方都应安装.NET 4.6.1

下载链接:


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

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

只有在属性窗口中发现O.p.链接到的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地狱。

什么是还原类?你自己的班级还是什么package@Gauravsa:最有可能是SMO SQL Server管理对象库中的类HI!新年快乐,是的,我仔细检查了一下,目标电脑安装了相同版本的.net framework 4.6.1。问题可能在别处吗?或者我是不是走错了路?感谢您的回答在这种情况下,由于某些原因,目标pc上似乎仍然加载了错误版本的SMO DLL。您可以使用来精确确定加载的内容。或者,根据我的经验,这被证明是一个非常快速、肮脏但有效的解决方案。在某些情况下,您可以在目标pc上安装最新的SQL Server Management Studio,因为它包含许多所需的SMO参考。但正如前面所说的,这是一个相当丑陋的解决方案,所以我建议您首先使用procmon进行调查。是否有办法配置我的应用程序以使用我引用的smo版本。而不使用安装在目标pc上的软件?