通过表单使用C#截断日志文件

时间:2016-06-16 01:52:46

标签: c# file logging truncate

我的表单通过此脚本显示数据和日志文件的值

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的情况下截断此日志文件。我可以通过表格截断它吗?

1 个答案:

答案 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发生。