2015-03-16 5 views
-2

Я пытаюсь создать нечто похожее на SQL Server Management Studio.Несколько запросов на одно и то же соединение с использованием тех же переменных T-SQL

Я хочу, чтобы возможность запуска нескольких запросов на одной и той же связи, как один делает в той же вкладке в SSMS, однако из C# каждый SqlCommand выполняется отдельно, даже с той же SqlConnection, поэтому они не могут видеть друг друга DECLARE «ю.ш.

Пример: При запуске двух запросов:

DECLARE @ted varchar(100) = 'Ted A'; 
SELECT @ted as [Query1]; 

и другие

SELECT @ted as [Query2]; 

Если вы запустите эти два, по порядку, отдельно на вкладке SSMS, вы должны получить два правильных результата, по одному от каждого запроса.

Однако проблема у меня есть, если у меня есть один SqlConnection, и я создаю два объекта SqlCommand, тогда они не видят переменную @ted, даже если они являются тем же самым соединением.

Как создать соединение с базой данных sql-сервера так, чтобы он вел себя как вкладка SSMS, так что каждый последующий запрос находится в той же области видимости, и поэтому я могу использовать @variables во всех запросах?

Примечание: такое же поведение, как и в SSMS, также можно найти в утилите SQLCMD.

Редактирование: я только что понял, что я спросил, а не как работает SSMS, это на самом деле невозможно. вы должны быть в состоянии получить доступ к #tables и т.д. из того же соединения, но не @variables

+1

Если вы запустите 'ВЫБРАТЬ @ted, как [Query2];' Этот запрос без объявления '@ ted' вы получите сообщение об ошибке –

+0

Почему вы хотите как это?? –

+0

Мне нужна возможность запускать два запроса 'in order', но некоторое время. –

ответ

0

Вы должны думать о едином окне запроса в SSMS, как примерно эквивалентно одной SQLCommand, и один экземпляра из SSMS, как грубо эквивалентно одному SqlConnection. Переменные TSQL имеют пакет scope не область связи.

SQLCommand выполняет партию TSQL, возможно, включая несколько исполняемых операторов. Вы можете просто поставить оба ваших запроса в одну команду.

Теперь, если вы хотите, чтобы ваша команда возвращала несколько значений из нескольких операторов select, вы должны использовать метод NextResult для SqlDataReader. Это переместится в результирующий набор следующего оператора. Обработайте результаты каждого утверждения, затем используйте 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(); 

Надеется, что это помогает

+0

Да, я знаю об этом, мне нужно, чтобы выполнялось несколько запросов на одной и той же вкладке. надеюсь, это имеет смысл. –

+0

Вы видели бит о NextResult? –

+0

да, я понимаю, я могу сделать 'select 1 as; выберите 2 как b; 'это не то, что я хочу. –

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()); 
     } 
    } 
} 
+0

Да, однако эта функция существует в SSMS. Я хочу знать, как я могу подражать этому поведению. Я хочу, чтобы какое-то соединение (вкладка) было создано, а затем мне нужен механизм отправки запросов к ним, но в той же области. как в SSMS, областью применения является вкладка, и вы можете выполнять несколько операторов отдельно в той же области. –

+0

Поведение по умолчанию в SSMS состоит в том, чтобы отправить всю вкладку и вернуть результаты. Вы также можете выбрать текст на вкладке и отправить его, но если вы не выделите delcares с запросом, появится ошибка. – Romoku

+0

ok и можете ли вы использовать одни и те же # таблицы в нескольких соединениях, я ошибаюсь, вы не можете делиться @variables, если вы их не выбираете –

Смежные вопросы