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();