Вернуть значения переменных из SQL запроса

RegisteredUser

Коллеги!Возникла насущная необходимость запускать скрипт из .Net приложения и получать данные из переменных скрипта.Привожу пример, который работает:
scriptText = "USE [WowDB]; " + 
" DECLARE @result int = 0; " + 
" SELECT @result = COUNT(*) FROM [dbo].[colRuns]; " + 
" SELECT @result as [Result];"; 

 using (SqlConnection con = new SqlConnection(SQLConnectionString))
 {
 int getCount = 0;

 using (SqlCommand cmd = new SqlCommand(scriptText, con))
 {
 con.Open();
 getCount = (int)cmd.ExecuteScalar();

 if (con.State == System.Data.ConnectionState.Open) con.Close();

 }
 }
Все работает и я получаю в переменную getCount значение @result.НО вопрос вот в чем:Как оформить код в .Net, чтобы получать значения напрямую из переменных SQL?Такой себе аналог EXECUTE sp_executesql
14 ответов

RegisteredUser

RegisteredUser, как и вызов любой другой процедуры с out параметрами. https://msdn.microsoft.com/ru-ru/library/59x02y99(v=vs.71).aspx


RegisteredUser

ну и скрипт должен быть адаптирован для этого действа


RegisteredUser

RegisteredUser, как и вызов любой другой процедуры с out параметрами. https://msdn.microsoft.com/ru-ru/library/59x02y99(v=vs.71).aspx
в том то и прикол, что процедуру вызывать НЕТ возможности.скрипт составляется динамически из логики .Net приложения.


RegisteredUser

Как оформить код в .Net, чтобы получать значения напрямую из переменных SQL?
В смысле "напрямую"? Разверни мысль.


RegisteredUser

В смысле "напрямую"? Разверни мысль.
допустим есть такой скрипт
scriptText = "USE [WowDB]; " + 
" DECLARE @result int = 0, @i int = 0; " + 
" SELECT @result = COUNT(*) FROM [dbo].[colRuns]; " + 
" ........... "; 
" SELECT @i = 120;";
Как в .Net прикладухе получить значения @result и @i ?


RegisteredUser

RegisteredUser,'...select @result, @i'+ ExecuteReader


RegisteredUser

RegisteredUser,А зачем такие извращения?Это анализатор
насущная необходимость
имхо Г.кодом пахнет.


RegisteredUser

RegisteredUser,А зачем такие извращения?Это анализаторимхо Г.кодом пахнет.
есть прикладухи, которые надо поддерживать и которые нельзя переписать заново, в силу разных причин.лет 5-7 назад кто-то написал такой код - его нужно обновить, не ломая все остальное.думаю, что еще лет через 6, кто-то взглянув на любой "древний код" учует запах разложения.


RegisteredUser

RegisteredUser,'...select @result, @i'+ ExecuteReader
спасибо! так и придется делать.просто думал, что есть что-то иное.


RegisteredUser

RegisteredUser,)


RegisteredUser

Если из сгенеренного кода убрать определение переменных, которые требуется получить, то эти переменные будут обычными out-параметрами:
using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=master;Integrated Security=True"))
using(var cmd = new SqlCommand(@"
 USE [master];
 -- DECLARE @result int = 0, @i int = 0;
 SELECT @result = COUNT(*) FROM [sys].[objects];
 SELECT @i = 120;
", cnn))
{
 cnn.Open();
 var result = new SqlParameter("@result", SqlDbType.Int) {Direction = ParameterDirection.Output};
 cmd.Parameters.Add(result);
 var i = new SqlParameter("@i", SqlDbType.Int) {Direction = ParameterDirection.Output};
 cmd.Parameters.Add(i);
 cmd.ExecuteNonQuery();
 Console.WriteLine(result.Value);
 Console.WriteLine(i.Value);
}
Вывод:
100120


RegisteredUser

Сон Веры Павловны,ШИКАРНО! это и нужно было))))


RegisteredUser

это и нужно было))))
нужно было что, написать готовый код?Этот ответ ведь был дан ранее 21188703


RegisteredUser

Этот ответ ведь был дан ранее 21188703
+1. Его надо было просто понять