1. 完整备份数据库的脚本
USE master;
GO
BACKUP DATABASE [$(dbname)] TO DISK = N'$(driver):$(location)$(dbname).bak' WITH NOFORMAT, NOINIT, NAME = N'$(dbname)-完整数据库备份', SKIP, NOREWIND, NOUNLOAD, STATS = 10 ;
BACKUP LOG [$(dbname)] TO DISK = N'$(driver):$(location)$(dbname).bak' WITH NO_LOG;
GO
USE [$(dbname)];
GO
DBCC SHRINKDATABASE(N'$(dbname)');
我将它存为Backupdatabasewithlocation.sql。
2. sqlcmd的批处理脚本
sqlcmd -U %1 -P %2 -v dbname=%3 driver=%4 location=%5 -i %6
我将它存为BackupdatabasewithLocation.bat。
3. 在VC中设定路径
CString app= "C://Program Files//Microsoft SQL Server//MSSQL.1//MSSQL//Backup//";
m_strBackupLocation = app; //m_strBackupLocation是一个Edit Box所绑定的CString变量。
记住,一定要在路径中添加连续的两个/符号,否则,VC会将单独的/符号视为在VC中连接下一行字符作为整个字符串的操作符。而且,记住,一定要在最后一个目录的后面再添加上//,否则,在接下来的_splitpath处理过程中,会把最后一层目录给忽略掉。
4. 处理VC中的路径
char _buffer[255];
GetShortPathName(m_strBackupLocation, _buffer, 256);//转换成短路径(无空格短路径)
char drive[500],dir[500];
CString test = _buffer;
_splitpath(test, drive, dir,NULL,NULL); //用_splitpath可解析出路径、文件名、扩展名
CString d = drive;
d.Replace(":","");
CString c = dir;
举例:
4.1 路径中无空格
CString app = "C://backup//";
4.2 路径中有空格
CString app= "C://Program Files//Microsoft SQL Server//MSSQL.1//MSSQL//Backup//";
设置断点后,得到以上的变量的值。
4.3 假若在最后一层路径后没有加//
CString app= "C://Program Files//Microsoft SQL Server//MSSQL.1//MSSQL//Backup";
5. 在VC中执行sqlcmd脚本
para="sa genius "+instanceName+" "+d+" "+c+" sql/Backupdatabasewithlocation.sql";
ShellExecute(NULL,"open","bat/BackupdatabasewithLocation.bat",para,NULL,SW_SHOW);