C#使用sql参数,现在赢得了';不起作用
本文关键字:不起作用 sql 使用 参数 | 更新日期: 2023-09-27 18:09:27
嘿,我的应用程序使用了参数化查询,运行得很好,但现在(我不知道为什么(它们不再被值替换。。。
因此,它没有运行类似"SELECT [TABLE_NAME] FROM [MyDefinetelyExistingDatabase]";
的程序,而是尝试执行"SELECT [TABLE_NAME] FROM [@targetDatabase]";
,当然,这将失败。
var dataBaseToGetTablesFrom = "MyDefinetelyExistingDatabase";
var results = new List<string>();
const string query = @"SELECT
[TABLE_NAME] AS tableName
FROM
[@targetDatabase].[INFORMATION_SCHEMA].[TABLES] ;";
using (var context = new ConnectionHandler(true))
{
if (context.Connection.State != ConnectionState.Open)
throw new ConnectionFailedException(context.Connection.State);
using (var command = new SqlCommand(query, context.Connection))
{
command.Parameters.AddWithValue("@targetDatabase", dataBaseToGetTablesFrom);
using (var reader = command.ExecuteReader())
{
if (!reader.HasRows)
return results.ToArray();
while (reader.Read())
results.Add(reader.GetString(0));
}
}
}
return results.ToArray();
我现在尝试了不同的格式和方法来添加参数,但结果是一样的。。。我不想通过string.Format
直接将值插入查询来实现这一点,例如,但我希望这些参数(在代码的不同位置正常工作(???((,但不是我想要的地方。
事实上,我需要在每个语句中使用参数,并且必须能够通过像[DB]那样调用它们来寻址不同的数据库。[表架构]。[表]
[编辑]
嘿,伙计们,几天前发现了这个问题,我想和你们分享一下。据我所知,我的问题是试图替换数据库名称和/或在其他一些示例中,替换表名称。因此,这将不起作用,这对我来说很有意义,因为服务器甚至不知道应该在哪个表上工作,因此对结构等一无所知,就无法准备执行语句。
所以我改变了我的陈述,以适应我的新知识,它像一种魅力一样如预期般发挥作用。
我不知道ConnectionHandler
是什么,但如果这是您自己的代码,您可以使用SqlConnectionStringBuilder来实现它,它将允许您使用变量来分配InitialCatalog
,而不是将数据库名称放入查询中。这比需要仔细清理的动态sql更可取。
您需要动态sql来实现这一点,比如。。。。。
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N' SELECT [TABLE_NAME] AS tableName '
+ N' FROM ' + QUOTENAME(@targetDatabase) + N'.[INFORMATION_SCHEMA].[TABLES]'
Exec sp_executesql @Sql