是否可以使用参数化查询执行备份语句



iam使用上述sql命令。但是参数没有添加。我有2个文本框来指定位置和名称。但是它没有传递到查询。有任何解决方案吗?

SqlConnection con = new SqlConnection(CS);
con.Open();
SqlCommand cmd= new SqlCommand("BACKUP DATABASE BillingSoftware TO DISK = '@Loc:\@Name.BAK'",con);
cmd.Parameters.AddWithValue("@Loc", textBox_BackupDatabaseLocation.Text);
cmd.Parameters.AddWithValue("@Name", textBox_BackupDatabaseName.Text);
cmd.ExecuteNonQuery();

,而不是传递两个单独的参数并试图在SQL脚本中串联它们,而只需将完整的路径作为单个参数传递。您可以从文件夹创建有效的路径,并使用System.io.path.combine:

创建文件名。
var folder=textBox_BackupDatabaseLocation.Text;
var filename = textBox_BackupDatabaseName.Text;
var fullPath=Path.Combine(folder,filename);
//...
var cmd= new SqlCommand("BACKUP DATABASE BillingSoftware TO DISK = @fullPath",con);
cmd.Parameters.AddWithValue("@fullPath", fullPath);
cmd.ExecuteNonQuery();

Path.Combine即使在文件夹名称中有EG拖尾或丢失的斜线,也会生成正确的文件路径,这将使字符串串联断开。

另一个选项是避免 SQL语句,并使用SQL Server Management对象库。最后,SMO生成SQL命令,但它在API中揭示了所有功能,应该使查找和指定其他选项非常容易。

我说应该,因为文档不符合SQL Server标准。类参考在那里,但是示例...检查备份并恢复数据库和事务日志。也许有一个更好的文档页面。

无论如何,示例代码可以蒸馏到此:

//Local server
var srv = new Server();  
var db = srv.Databases["AdventureWorks2012"];    
var bk = new Backup
         {
             Action = BackupActionType.Database,
             BackupSetDescription = "Full backup of Adventureworks2012",
             BackupSetName = "AdventureWorks2012 Backup",
             Database = "AdventureWorks2012",
             Checksum = true
         };
var bdi = new BackupDeviceItem(fullDestinationPath,DeviceType.File);  
bk.Devices.Add(bdi);  
bk.SqlBackup(srv);  

优势是您可以针对多个数据库,例如循环中的多个数据库,获取进度通知等。

update

路径类包含可用于验证路径的方法,例如路径。可以使用isPathroted来检查路径是否是完整的路径。其他System.IO类可用于验证,例如目录。

,因为您需要分别连接disk location和数据库backup filename,因此您应该添加+以串联以获得BAK文件的绝对路径。

尝试使用以下查询:

SqlCommand cmd= new SqlCommand("BACKUP DATABASE BillingSoftware TO DISK = @Loc + ':\' + @Name + '.BAK'",con);

由于阅读了您的评论后,您需要分别传递这两个参数。您需要在每条线上创建变量,然后用于串联,因为T-SQL不允许直接串联变量。我为你有解决方法:

declare @drive varchar(max);declare @path varchar(max);declare @fullpath varchar(max);set @drive = @Loc + ':\';set @path = @Name + '.bak' ;set @fullpath = @drive + @path;BACKUP DATABASE BillingSoftware TO DISK = @fullpath

它看起来有些额外,但会满足您的需求。稍后谢谢我!

为了避免SQL注入,更好的连接文件名和c#侧的路径:

string dbBackupName = "some name here.bak";
            SqlConnection con = new SqlConnection(CS);
            con.Open();
            SqlCommand cmd = new SqlCommand("BACKUP DATABASE BillingSoftware TO DISK = @dbFullName", con);
            cmd.Parameters.AddWithValue("@dbFullName", textBox_BackupDatabaseLocation.Text + "\" + dbBackupName);
            cmd.ExecuteNonQuery();

相关内容

  • 没有找到相关文章

最新更新