2010-04-18 5 views
0

Я делаю службу Windows, чтобы иметь возможность запускать операции с базой данных SQL Server (вставка, редактирование и т. Д.) И вызывать хранимые процедуры.Знание типа хранимой процедуры при вызове с C#

Однако, есть ли способ узнать тип SP? При вызове с C# мне нужно knof, если оно возвращает 1 значение или больше, или none (так что я могу использовать execereader, scalar и т. Д.)?

Благодаря

ответ

0
  1. без запроса обычно вызывается с SqlCommand.ExecuteNonQuery(). Но это действительно так, чтобы запустить его как SqlCommand.ExecuteReader(). Единственное отличие состоит в том, что первый вызов DataReader.Read() возвращает false для хранимой процедуры, которая не возвращает набор результатов.
  2. A набор строк выполнен как SqlCommand.ExecuteReader(). Первый звонок DataReader.Read() вернет true.
  3. A скаляр - это просто ярлык для набора строк с одним столбцом и одной строкой.

Таким образом, вы можете использовать ExecuteReader во всех трех сценариях.

Хотя для вашего вопроса кажется ненужным, вы можете получить метаданные для набора результатов, используя опцию fmtonly. Этот параметр заставляет оператор возвращать только данные столбца; никакие строки данных не возвращаются. Таким образом, вы можете запустить:

SET FMTONLY ON; 
EXEC dbo.YourProc @par1 = 1; 
SET FMTONLY OFF; 

Выполнение это как CommandText из C#, вы можете проверить имена столбцов хранимая процедура будет возвращать.

Чтобы убедиться, что хранимая процедура запуска, таким образом, не производит каких-либо побочных эффектов, я побежал следующий тестовый пример:

create table table1 (id int) 
go 
create procedure YourProc(@par1 int) 
as 
insert into table1 (id) values (@par1) 
go 
SET FMTONLY ON; 
EXEC dbo.YourProc @par1 = 1; 
SET FMTONLY OFF; 
go 
select * from table1 

Это не возвращает ни одной строки. Таким образом, параметр только для формата гарантирует, что фактические обновления или вставки не возникнут.