2

パラメータ付きの SqlCommand を使用して、テーブル内の列の 1 つのデータ型を変更しようとしていますが、うまくいきません。これが私のコードです:

    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 の近くの構文が正しくありません」。この問題の解決策が見つかりません。ストアド プロシージャを使用することもできますが、コードが機能しない理由を知りたいのです。私は通常、select、insertステートメントのパラメーターを指定してSqlCommandを使用しますが、alterステートメントでは機能しないようです?

4

3 に答える 3

6

デフォルトでは、tableName と列名はパラメータ化できないためです。SQL インジェクションを回避する方法の 1 つは、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 に答える