我正在尝试创建类似于SQL Server Management Studio的内容。
我希望能够在同一个连接上运行多个查询,就像在SSMS中的同一个标签中一样,但是从c#开始,每个SqlCommand
都会单独执行,即使是相同的SqlConnection
,所以他们可以&# 39;看到彼此DECLARE
'
示例:如果您运行两个查询:
DECLARE @ted varchar(100) = 'Ted A';
SELECT @ted as [Query1];
和另一个
SELECT @ted as [Query2];
如果按顺序在SSMS
标签中运行这两个,您应该得到两个正确的结果,每个查询一个。
但问题是,如果我有一个SqlConnection
而我创建了两个SqlCommand
个对象,那么即使它们是相同的连接,它们也看不到@ted
变量
如何创建与sql server数据库的连接,使其行为类似于SSMS选项卡,因为每个后续查询都在同一范围内,因此我可以在所有查询中使用@variables
?
注意:也可以在SQLCMD
实用程序中找到与SSMS相同的行为。
编辑:我刚刚意识到我所问的不是SSMS是如何工作的,这实际上是不可能的。 你应该能够从同一个连接访问#tables等,但不能访问@variables
答案 0 :(得分:0)
您应该将SSMS中的单个查询窗口视为大致等同于单个SQLCommand,并将SSMS的单个实例大致等同于单个SqlConnection。 TSQL变量具有批范围而非连接范围。
SQLCommand执行一批TSQL,可能包括多个可执行语句。您可以将两个查询简单地放在一个命令中。
现在,如果您希望命令从多个select语句返回多个值,则可以使用SqlDataReader的NextResult方法。这将移动到下一个语句的结果集。处理每个语句的结果,然后使用NextResult来交互结果集。
简单示例
queryText = "Declare @Ted Varchar(100) = 'Ted A'; SELECT @ted --Or some other query using @ted; Select @ted --or yet another query using @ted;"
command = new SqlCommand(queryText);
reader = command.ExecuteReader();
do
{
//Result set handling code goes here
do
{
//Record level handling code goes here
} while reader.Read();
//More result set handling code goes here
} while reader.NextResult();
希望这有帮助
答案 1 :(得分:0)
DECLARE
的范围是命令,而不是连接。如果要重用声明,则需要使用T-SQL解析器。
否则你可以开始使用这样的东西:
var commandText =
"DECLARE @ted varchar(100) = 'Ted A';" +
"SELECT @ted as [Query1];" +
"SELECT @ted as [Query2];";
using(var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand(commandText, connection))
{
using(var reader = command.ExecuteReader())
{
// There are two result sets and each result set has one result.
do
{
// You will need to use the Schema Table to dynamically
// generate the results view
var schema = reader.GetSchemaTable();
// "ColumnName" column will have the "Query1" and "Query2"
var columnNameColumn = schema.Columns["ColumnName"];
var row = schema.Rows[0][columnNameColumn];
Console.WriteLine(row);
// Now we write the results
while(reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
}
while(reader.NextResult());
}
}
}