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

Truncating Log File using C# via Forms

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

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

但是在点击截断按钮后出现了这个错误

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: Incorrect syntax near 'db'.

'RECOVERY' is not a recognized SET option.

Incorrect syntax near 'db'.

有没有其他方法可以在不通过 SQL Server Management Studio 的情况下截断此日志文件。我可以通过我的表格截断它吗?

您的命令脚本包含语法错误。如果您检查 cmd.CommandText,您会发现该命令如下所示:

ALTER DATABASE 'db'SET RECOVERY SIMPLE;DBCC SHRINKFILE (2, 1);GO ALTER DATABASE 'db'SET RECOVERY FULL;

当我 运行 SqlServer 2016 数据库上的那一行时,the result is

Incorrect syntax near 'db'. 'RECOVERY' is not a recognized SET option. Incorrect syntax near '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 发生。