C# 使用现在不起作用的 sql 参数

C# Using sql parameters which now won't work

嘿,我在我的应用程序中使用参数化查询,它工作得很好,但现在(我不知道为什么)它们不再被值替换...

因此,它尝试执行 "SELECT [TABLE_NAME] FROM [@targetDatabase]"; 而不是 运行 类似 "SELECT [TABLE_NAME] FROM [MyDefinetelyExistingDatabase]"; 的东西,这当然会失败。

 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]。[Table-Schema]。[Table]

[编辑]

嘿,伙计们,前几天想通了这个问题,我想和你们分享一下。 据我所知,我的整个问题是尝试替换数据库名称和/或在其他一些示例中,还有 table 名称。 所以这对我来说是行不通的,因为服务器无法准备执行一条语句,如果它甚至不知道它应该在哪个 table 上工作,因此对结构一无所知等等

所以我改变了我的陈述以适应我的新知识并且它如预期般有效。

你需要动态 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 

我不知道 ConnectionHandler 是什么,但如果那是你自己的代码,你可以用 SqlConnectionStringBuilder 实现它,这样你就可以使用变量来分配 InitialCatalog 而不是将数据库名称放入查询中。这比需要仔细清理的动态 sql 更可取。