更改表 SqlCommand
Posted
技术标签:
【中文标题】更改表 SqlCommand【英文标题】:Alter table SqlCommand 【发布时间】:2021-12-08 07:47:40 【问题描述】:我正在尝试使用带有参数的 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 语句?
【问题讨论】:
【参考方案1】:因为默认情况下,tableName 和列名不能参数化。避免 sql 注入的一种方法是创建一个用户定义函数来检查 tableName 是否有效。然后连接字符串上的名称。例如,
这是 UDF
private bool IsValidColumnNameOrTableName(string tablecolumnName)
// other codes
return returnValue;
【讨论】:
感谢您的帮助。我会调查的! 有趣...也许提供一些文档的链接来解释为什么对参数有这种限制? @Gigi 这里***.com/questions/372033/… 赞成这个想法,因为我试图通过不使用字符串连接来避免 sql 注入。【参考方案2】:您不能在 DDL 语句中使用参数。您应该动态创建语句字符串:
DBSql.ExecSQLStatement(
"ALTER TABLE " + TableColumnArray[0] + " ALTER COLUMN " + TableColumnArray[1] + " varchar(MAX)",
dict,connectionStringName);
【讨论】:
【参考方案3】:您需要准确指定表名和列名:
"ALTER TABLE " + TableColumnArray[0].ToString( ) + " ALTER COLUMN " + TableColumnArray[1].ToString( ) + "varchar(MAX)"
sql server 不允许表名和列名是变量值的语法
【讨论】:
我不想使用字符串连接。感谢您的回复以上是关于更改表 SqlCommand的主要内容,如果未能解决你的问题,请参考以下文章
高悬赏!如何实现在c#中写SQL查询2个不同的表插入2个不同的表的记录!
不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项