在C#ASP.NET和SQL Server 2008 R2中使用SqlParameter实现安全性

在C#ASP.NET和SQL Server 2008 R2中使用SqlParameter实现安全性,c#,asp.net,sql,C#,Asp.net,Sql,为了增强安全性,我将以下C#标记转换为使用SqlParameter(我是SqlParameter新手): public static void EmptyTable(string TableToEmpty) { try { using (SqlConnection conn = new SqlConnection(DatabaseConnectionString)) { using (SqlCommand cmd = new

为了增强安全性,我将以下C#标记转换为使用SqlParameter(我是SqlParameter新手):

public static void EmptyTable(string TableToEmpty)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand("TRUNCATE TABLE @prmTableToEmpty", conn))
            //using (SqlCommand cmd = new SqlCommand("TRUNCATE TABLE " + TableToEmpty, conn))
            {
                cmd.Parameters.Add(new SqlParameter("@prmTableToEmpty", TableToEmpty));
                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
    catch
    {
        throw;
    }
}
如果不使用参数,则工作平稳。但是,通过这种语法,我得到了以下异常:

    [SqlException (0x80131904): Incorrect syntax near '@prmTableToEmpty'.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2073550
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5064508
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +215
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +178
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137
   pjsql.EmptyTable(String TableToEmpty) in c:\website\App_Code\mySqlClass.cs:67
   _Default.btnEmptyTheTable_Click(Object sender, EventArgs e) in c:\website\Default.aspx.cs:83
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
提到的两个行号都包含抛出;指挥部

我经历了这样的过程:

并尝试了另一种语法:

但是没有运气


我缺少什么?

参数不能代替对象名

要增强动态替换对象名称时的安全性,请使用(首先使用参数执行命令
选择quotename(@prmTableToEmpty)
,然后使用此命令的结果生成
截断
命令,并在不带参数的情况下执行)


catch{throw;}
部分毫无意义,应该全部删除。在进入安全性之前,我不明白为什么我的标记不起作用,我想了解我的语法有什么问题。@Different111222正如我所说,不能用参数代替对象名。没有什么需要纠正的,它不会起作用。必须以与保留关键字相同的方式提供对象名称。例如,您不能使用参数而不是“TRUNCATE”来偶尔传递“CREATE”而不是“TRUNCATE”。谢谢,它可以工作。但这有助于验证是否需要在数据库中查找表。那么更复杂的卫生设施呢?这是我正在构建的一个sql类。其中一种方法是为传递给方法的已知表名创建一个表(太长,无法解释,基本上这是一个学习系统)。我在那里做什么?如何清理列描述中的文本,即所有列的单个字符串?@Different111222如果不使用成熟的SQL解析器,您不会。如果您需要允许用户创建具有任意结构的表,那么您必须在数据库帐户下执行用户提供的命令,该数据库帐户只允许在特定架构中创建表,而无需其他权限。
using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
{
    conn.Open();

    string sanitized_name;

    using (SqlCommand cmd = new SqlCommand("select quotename(@prmTableToEmpty)", conn))
    {
        cmd.Parameters.Add(new SqlParameter("@prmTableToEmpty", TableToEmpty));
        sanitized_name = (string)cmd.ExecuteScalar();
    }

    using (SqlCommand cmd = new SqlCommand("TRUNCATE TABLE " + sanitized_name, conn))
    {
        cmd.ExecuteNonQuery();
    }
}