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]那样调用它们来寻址不同的数据库。[表架构]。[表]

[编辑]

嘿,伙计们,几天前发现了这个问题,我想和你们分享一下。据我所知,我的问题是试图替换数据库名称和/或在其他一些示例中,替换表名称。因此,这将不起作用,这对我来说很有意义,因为服务器甚至不知道应该在哪个表上工作,因此对结构等一无所知,就无法准备执行语句。

所以我改变了我的陈述,以适应我的新知识,它像一种魅力一样如预期般发挥作用。

C#使用sql参数,现在赢得了';不起作用

我不知道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