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 更可取。
嘿,我在我的应用程序中使用参数化查询,它工作得很好,但现在(我不知道为什么)它们不再被值替换...
因此,它尝试执行 "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 更可取。