如何使用 Select 查询带参数的 table 名称?
How to use Select query for table names with parameters?
当使用 Insert 查询时,参数将正常工作,因为它用于值,但如果我要为 Create[=27 使用参数=] 或 Select 查询 table 名称,它不会发生,因为显然 table 名称必须是静态的。
#例如
SqlCommand myCommand = new SqlCommand("create table @1 ([BACK_LANG] varchar(50)");
myCommand.Connection = myDatabase;
myCommand.Parameters.AddWithValue("@1", this.getName()); //it was already set
myCommand.ExecuteNonQuery();
但我确实需要使用带参数的 Select/Create 查询,因为我将从他们创建的 table 中进行选择。
遗憾的是我无法想出解决方案,不得不使用非参数方式,这很容易受到 SQL 注入的攻击,我过去几天所做的 google 搜索没有'不要帮我。
如何在 SQL 服务器中使用 Create/Select 查询 table 名称?
您不能将对象名称作为参数直接传递给这样的语句。您仍然可以使用参数,但命令必须是这样的:
(@"declare @sql nvarchar(max) = N'create table dbo.'
+ QUOTENAME(@1) + N'([BACK_LANG] varchar(50));';
EXEC sys.sp_executesql @sql;")
或者使用 SqlCommandBuilder
的 QuoteIdentifier(this.getName())
在 C# 中构建字符串,它提供与 QUOTENAME()
.
类似的保护
有关 SQL 注入的更多信息:Dynamic SQL
当使用 Insert 查询时,参数将正常工作,因为它用于值,但如果我要为 Create[=27 使用参数=] 或 Select 查询 table 名称,它不会发生,因为显然 table 名称必须是静态的。
#例如
SqlCommand myCommand = new SqlCommand("create table @1 ([BACK_LANG] varchar(50)");
myCommand.Connection = myDatabase;
myCommand.Parameters.AddWithValue("@1", this.getName()); //it was already set
myCommand.ExecuteNonQuery();
但我确实需要使用带参数的 Select/Create 查询,因为我将从他们创建的 table 中进行选择。
遗憾的是我无法想出解决方案,不得不使用非参数方式,这很容易受到 SQL 注入的攻击,我过去几天所做的 google 搜索没有'不要帮我。
如何在 SQL 服务器中使用 Create/Select 查询 table 名称?
您不能将对象名称作为参数直接传递给这样的语句。您仍然可以使用参数,但命令必须是这样的:
(@"declare @sql nvarchar(max) = N'create table dbo.'
+ QUOTENAME(@1) + N'([BACK_LANG] varchar(50));';
EXEC sys.sp_executesql @sql;")
或者使用 SqlCommandBuilder
的 QuoteIdentifier(this.getName())
在 C# 中构建字符串,它提供与 QUOTENAME()
.
有关 SQL 注入的更多信息:Dynamic SQL