我的表单通过此脚本显示数据和日志文件的值
SqlConnection con = new SqlConnection("Data Source='"+ ip.Text+"';Initial Catalog='"+ database.Text +"';User ID=1;Password=1");
// DateTime dt = new DateTime();
//dt = DateTime.Now;
SqlDataAdapter sda5 = new SqlDataAdapter("SELECT name, type_desc, size FROM sys.database_files", con);
DataTable dt5 = new DataTable();
sda5.Fill(dt5);
dataGridView1.DataSource = dt5;
dataGridView1.DefaultCellStyle.Format = "n2";
con.Close();
在我的表单上显示数据后,我在下面有一个按钮,会截断此日志文件。
SqlConnection con = new SqlConnection("Data Source='"+ ip.Text+"';Initial Catalog='"+ database.Text +"';User ID=1;Password=1");
con.Open();
SqlCommand cmd = new SqlCommand("ALTER DATABASE '" + database.Text + "'" +
"SET RECOVERY SIMPLE;" +
"DBCC SHRINKFILE (2, 1);"+
"GO ALTER DATABASE '" + database.Text + "'" +
"SET RECOVERY FULL;",con);
cmd.ExecuteNonQuery();
try
{
MessageBox.Show("Truncated");
}
catch
{
MessageBox.Show("Error");
throw;
}
con.Close();
但点击截断按钮后我有这个错误
类型' System.Data.SqlClient.SqlException'未处理的异常发生在System.Data.dll
中其他信息:db'附近的语法不正确。
'回收'不是公认的SET选项。
db'附近的语法不正确。
有没有其他方法可以在不通过SQL Server Management Studio的情况下截断此日志文件。我可以通过表格截断它吗?
答案 0 :(得分:1)
您的命令脚本包含语法错误。如果你检查cmd.CommandText
,你会发现命令如下所示:
ALTER DATABASE 'db'SET RECOVERY SIMPLE;DBCC SHRINKFILE (2, 1);GO ALTER DATABASE 'db'SET RECOVERY FULL;
当我在SqlServer 2016数据库上运行该行时,the result is
'db'附近的语法不正确。 'RECOVERY'不是公认的SET选项。 'GO'附近的语法不正确。
这意味着根据Alter Database语句和其他规则的语法规则,命令不正确。
至少你的陈述应该是这样的,重要的是GO
本身就在一行上,并且数据库名称不被单引号括起来。
ALTER DATABASE db SET RECOVERY SIMPLE;DBCC SHRINKFILE (2, 1);
GO
ALTER DATABASE db SET RECOVERY FULL;
C#提供verbatim strings,这些方便派对:
SqlCommand cmd = new SqlCommand(String.Format(
@"ALTER DATABASE [{0}]
SET RECOVERY SIMPLE;
DBCC SHRINKFILE (2, 1);
GO
ALTER DATABASE [{0}]
SET RECOVERY FULL;" ,
database.Text),con);
您不能在此处使用参数,因此您不得不使用字符串格式将参数放入sql语句中。请确保database.Text
是您控制的内容,并且您的应用程序用户无法输入,以防止SQL injection attacks发生。