2015-10-16 156 views
0

问题出在可变小时,当我尝试在CmdString中使用时引发异常。我不明白为什么在变量小时是字符串时抛出异常。我怎么解决这个问题。我在这里错过了什么。将varchar值“..”转换为数据类型int时的转换失败

string ConString = ConfigurationManager.ConnectionStrings["DbSystem"].ConnectionString; 
string CmdString = string.Empty; 

DateTime time = DateTime.Now; 
string hour = time.Hour.ToString(); 

using (SqlConnection con = new SqlConnection(ConString)) 
{ 
    string folderName = DateTime.Now.Day.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Year.ToString(); 
    string folder = Path.Combine(FOLDER_FOR_BACKUP_FILES); 
    Directory.CreateDirectory(FOLDER_FOR_BACKUP_FILES); 

    CmdString = @"declare @fileName varchar(100); declare @dbName varchar(100); declare @fileDate varchar(20); set @fileName = '" + folder + @"\'; set @dbName = 'DbSystem'; set @fileDate = convert(varchar(20), getdate(), 105); set @fileName = @fileName + @dbName + ' ' + @fileDate + '-' + " + hour + @" + '.bak'; backup database @dbName to disk = @fileName;"; 

    SqlCommand cmd = new SqlCommand(CmdString, con); 

    SqlDataAdapter sda = new SqlDataAdapter(cmd); 
    DataTable dt = new DataTable("*"); 
    sda.Fill(dt); 
} 
+0

您应该使用参数化查询,而不是像SQL注入那样构建您的命令字符串!看看这里的答案:http://stackoverflow.com/questions/7505808/using-parameters-in-sql-statements – CeOnSql

回答

2

你应该CONVERT您小时VARCHAR

@fileDate + '-' + CONVERT(VARCHAR(20), " + hour + @") + '.bak'; 

虽然hour是在应用端的字符串,当它是由SQL Server的执行,这是一个INT。所以你需要隐含地包含一个CONVERT函数。

1

因为小时现在是字符串。您可以将CmdString更改为

CmdString = @"declare @fileName varchar(100); declare @dbName varchar(100); declare @fileDate varchar(20); set @fileName = '" + folder + @"\'; set @dbName = 'DbSystem'; set @fileDate = convert(varchar(20), getdate(), 105); set @fileName = @fileName + @dbName + ' ' + @fileDate + '-' + '" + hour + @"' + '.bak'; backup database @dbName to disk = @fileName;"; 
相关问题