读取存储过程的结果数据集

时间:2015-06-02 06:44:21

标签: sql-server sql-server-2008 procedure

我正在从存储过程创建aspx表单生成器,我有像

这样的存储过程
CREATE PROCEDURE [dbo].[OU_Test_ALL]
@ID_Login uniqueidentifier = null,
@ID int = null
AS
BEGIN

declare @Error int, @Message varchar(500), @SQL varchar(max)
set @Message = 'Error'

exec @Error=dbo.CheckPermissions @ID_Login=@ID_Login, @ID=@ID, @ID_Action='OU_Test_ALL'
begin
  goto FAILED
end

select
        OU_Test.Value1Int,
        OU_Test.Value2Varchar,
        OU_Test.Value3Bit,
        OU_Test.Value4Varchar,
        OU_Test.Value5Int
from OU_Test
where (@ID is null or OU_Test.ID=@ID)

return 0

FAILED:
raiserror (@Message, 16, 1)
return 1

END

我需要在不调用它的情况下读取结果。

我能够使用

在Management Studio中获取一些元数据
SET FMTONLY ON;
exec OU_Test_ALL
SET FMTONLY OFF;

,但我无法在C#应用程序中读取此元数据。

有没有办法在不调用存储过程的情况下读取结果列?

2 个答案:

答案 0 :(得分:0)

这是致电stored procedure

的方法
   SqlCommand command = new SqlCommand("SET FMTONLY ON; exec sp_sptest; SET FMTONLY OFF;"
                                       , connection);

    command.Connection.Open();

    var reader = command.ExecuteReader();
    DataTable resultTable = new DataTable();
    resultTable.Load(reader);

    command.Connection.Close();

列已归档,您可以看到列类型,名称等。行未填充。

答案 1 :(得分:0)

我建议使用SqlDataReader.GetSchemaTable方法。使用SET FMTONLY ON;调用您的存储过程,该结构将在DataTable返回的GetSchemaTable()中提供。

或者,SqlCommand SET FMTONLY方法有一个重载,如果您传入SchemaOnly的{​​{3}},则会为您处理SqlDataReader _Reader = null; _Reader = _Command.ExecuteReader(CommandBehavior.SchemaOnly); DataTable _Schema = _Reader.GetSchemaTable();

有些事情:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each lbl In Me.Controls.OfType(Of Label)()
        MessageBox.Show(lbl.Name)
        MessageBox.Show(lbl.Text)
    Next
End Sub