通过 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 发生。
我的表单通过此脚本显示数据和日志文件的值
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 发生。