ServerConnection构造函数不接受SqlConnection并报CS1503错误的问题咨询
问题根因
- CS1503报错:你当前使用的
SqlConnection属于System.Data.SqlClient命名空间,而SMO 160及以上版本的ServerConnection构造函数中,接受SqlConnection参数的重载,要求传入的是Microsoft.Data.SqlClient命名空间下的SqlConnection实例,两个命名空间下的类完全独立不兼容。编译器匹配不到对应重载时,会尝试匹配最近的可选重载,就出现了转换为IRenewableToken失败的错误提示。 - IDE无响应卡顿:你代码中定义的
conn是SqlConnectionInfo类型,和SqlConnectionObject属性要求的SqlConnection类型完全不匹配,错误的类型赋值触发了Visual Studio静态代码检查的异常,进而导致IDE卡死。
修复步骤
- 卸载项目中引用的
System.Data.SqlClientNuGet包,安装官方最新的Microsoft.Data.SqlClient包 - 代码中所有
SqlConnection相关的引用,统一替换为Microsoft.Data.SqlClient命名空间下的实现 - 修正类型不匹配问题,直接构造
Microsoft.Data.SqlClient.SqlConnection实例传给ServerConnection构造函数即可,不需要额外使用SqlConnectionInfo - 异步备份操作不要提前关闭连接,避免备份过程中连接被释放导致任务失败
修正后代码
using Microsoft.Data.SqlClient; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.Win32; using System; using System.Windows; using System.Windows.Media.Animation; // 你的业务逻辑代码内 SaveFileDialog sfd = new SaveFileDialog(); // 此处替换为你从配置中读取到的真实数据库连接字符串 string connString = @"你的真实数据库连接字符串"; sfd.Filter = "Database backup files (*.bak)|*.bak"; sfd.Title = "Create Database Backup"; sfd.FileName = DateTime.Today.ToString("ddMMMyyyy") + ".bak"; if (sfd.ShowDialog() == true) { SqlConnection.ClearAllPools(); using (SqlConnection conn = new SqlConnection(connString)) { ServerConnection servConn = new ServerConnection(conn); try { servConn.Connect(); Server serverdb = new Server(servConn); Backup backupdb = new Backup() { Action = BackupActionType.Database, Database = "whdb" }; backupdb.Devices.AddDevice(sfd.FileName, DeviceType.File); backupdb.Initialize = true; backupdb.Incremental = false; // 如果需要同步执行避免后续逻辑提前执行,可换成SqlBackup方法 backupdb.SqlBackupAsync(serverdb); Storyboard sb = Resources["sbHideAnimation"] as Storyboard; StatusLable.Content = @"اطلاعات صادر شد."; sb.Begin(StatusLable); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { if (servConn.IsOpen) { servConn.Disconnect(); } } } }
内容的提问来源于stack exchange,提问作者TheDeparted
相关产品推荐
相关产品推荐

