2

我正在尝试使用带有参数的 SqlCommand 更改表中某一列的数据类型,但它不起作用。这是我的代码:

    Dictionary<string,string> dict = new Dictionary<string,string>();
    dict.Add("@TableName",TableColumnArray[0].ToString( ));
    dict.Add("@ColumnName",TableColumnArray[1].ToString( ));
    DBSql.ExecSQLStatement( "ALTER TABLE @TableName ALTER COLUMN @ColumnName varchar(MAX)",dict,connectionStringName);

    public static void ExecSQLStatement (string strsql,Dictionary<string,string> dict,string  connectionStringName)
    {
        SqlConnection con = CreateSqlConnectionStr(connectionStringName);
        SqlCommand cmd = new SqlCommand(strsql,con);
        foreach(string dictKey in dict.Keys)
        {
            cmd.Parameters.Add(new SqlParameter(dictKey,dict[dictKey]));
        }
        con.Open( );
        cmd.ExecuteNonQuery( );
        con.Close( );
    }

但是代码不断抛出错误:“@TableName 附近的语法不正确”。我找不到这个问题的解决方案。我可以尝试使用存储过程,但我真的很想知道为什么代码不起作用。我通常将 SqlCommand 与参数一起用于 select、insert 语句,但它似乎不适用于 alter 语句?

4

3 回答 3

6

因为默认情况下, tableName 和列名不能 PARAMETERIZED。避免 sql 注入的一种方法是创建一个用户定义函数来检查 tableName 是否有效。然后连接字符串上的名称。例如,

这是UDF

private bool IsValidColumnNameOrTableName(string tablecolumnName)
{
    // other codes
    return returnValue;
}
于 2013-03-03T13:58:37.680 回答
1

您不能在 DDL 语句中使用参数。您应该动态创建语句字符串:

DBSql.ExecSQLStatement(
    "ALTER TABLE " + TableColumnArray[0] + " ALTER COLUMN " + TableColumnArray[1] + " varchar(MAX)",
    dict,connectionStringName);
于 2013-03-03T13:59:08.883 回答
0

您需要准确指定表名和列名:

"ALTER TABLE " + TableColumnArray[0].ToString( ) + " ALTER COLUMN " + TableColumnArray[1].ToString( ) + "varchar(MAX)"

sql server 不允许表名和列名是变量值的语法

于 2013-03-03T13:59:14.137 回答