从C#调用时知道存储过程的类型

时间:2010-04-18 23:06:28

标签: c# sql-server

我正在制作一个Windows服务,以便能够在sql server数据库上运行(插入,编辑等)并调用Stored Procs。

但是,有没有办法让我知道SP的类型?当从C#调用时,我需要知道它是否返回1个值,或更多,或者没有(所以我可以使用executereader,scalar等)?

由于

1 个答案:

答案 0 :(得分:0)

  1. 通常使用SqlCommand.ExecuteNonQuery()调用非查询。但是将它作为SqlCommand.ExecuteReader()运行是有效的。唯一的区别是第一次调用DataReader.Read()会返回false,表示存储过程没有返回结果集。
  2. 行集SqlCommand.ExecuteReader()运行。第一次调用DataReader.Read()将返回true
  3. 标量只是具有一列和一行的行集的快捷方式。
  4. 因此,您可以在所有三种情况下使用ExecuteReader

    虽然您的问题似乎没必要,但您可以使用fmtonly选项检索结果集的元数据。该设置导致语句仅返回列信息;没有返回任何数据行。所以你可以运行:

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

    从C#执行此作为CommandText,您可以检查存储过程将返回的列名。

    为了验证以这种方式运行的存储过程不会产生任何副作用,我运行了以下测试用例:

    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
    

    这没有返回任何行。因此,仅格式选项可确保不会发生实际更新或插入。