C# 读取SQL Server存储过程在每次迭代While循环期间输出的表

C# 读取SQL Server存储过程在每次迭代While循环期间输出的表,c#,c++,.net,vb.net,C#,C++,.net,Vb.net,我正在执行一个存储过程,存储过程中有一个WHILE循环。每次迭代在WHILE循环中发生时,它都会输出一个表(显示其进度)。我想捕获这个表并在.NET中读取它(使用.NETSQLClient驱动程序)。我希望能够在生成此进度表时(如在SSMS中)而不是在存储过程完成运行时读取此进度表 PS:我不在乎你喜欢什么.NET语言——任何语言的解决方案或想法都将不胜感激。我想我已经想出了一种方法来做到这一点。我首先创建了一个小型本地数据库,其中有一个名为Table1的表,该表有一个名为status的文本列。

我正在执行一个存储过程,存储过程中有一个WHILE循环。每次迭代在WHILE循环中发生时,它都会输出一个表(显示其进度)。我想捕获这个表并在.NET中读取它(使用.NETSQLClient驱动程序)。我希望能够在生成此进度表时(如在SSMS中)而不是在存储过程完成运行时读取此进度表


PS:我不在乎你喜欢什么.NET语言——任何语言的解决方案或想法都将不胜感激。

我想我已经想出了一种方法来做到这一点。我首先创建了一个小型本地数据库,其中有一个名为Table1的表,该表有一个名为status的文本列。我还创建了一个名为StoredProcedure1的StoredProcedure。看起来是这样的:

CREATE PROCEDURE dbo.StoredProcedure1
/*
(
@parameter1 int = 5,
@parameter2 datatype OUTPUT
)
*/ AS
declare @setCount int 
declare @result table (cnt int)
set @setCount = 0

insert into Table1 (status) VALUES ('Starting');

while @setCount < 5
begin
    WAITFOR DELAY '00:00:03';

    insert into @result (cnt)
    select @setCount
    set @setCount = @setCount + 1;

    update Table1 set status='Iteration ' + cast(@setCount as varchar);
end

RETURN
然后我创建了另一个方法来检查表1中的状态,直到存储过程完成

Private Sub StatusChecker()
    Dim _conn As New SqlClient.SqlConnection("Data Source=.\sqlexpress;Initial Catalog=MARS_ProcTest;Integrated Security=True;MultipleActiveResultSets=True;")
    Dim cmd As New SqlClient.SqlCommand("select status from Table1", _conn)
    Dim ds As New DataSet

    _conn.Open()

    While Not _done
        Dim stat As String

        stat = cmd.ExecuteScalar()

        If Me.InvokeRequired() Then
            Me.Invoke(Sub()
                          Me.Label1.Text = stat
                      End Sub)
        Else
            Me.Label1.Text = stat
        End If
    End While

    _conn.Close()

End Sub
我添加了一个简单的方法,在LongRunningProcess完成时将form类上的私有布尔值翻转为true

Private Sub FinishProcess()
    '_done is a private variable on the form class.
    _done = True
End Sub
最后,在表单的加载事件中,我使用.NET的任务库启动状态检查器和长时间运行的流程,确保长时间运行的流程任务在完成过程中继续

    Private Sub LongRunningProcess()
    Dim _conn As New SqlClient.SqlConnection("Data Source=.\sqlexpress;Initial Catalog=MARS_ProcTest;Integrated Security=True;MultipleActiveResultSets=True;")
    Dim cmd As New SqlClient.SqlCommand("exec StoredProcedure1", _conn)
    Dim ds As New DataSet

    _conn.Open()
    cmd.ExecuteNonQuery()
    _conn.Close()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

    Task.Factory.StartNew(AddressOf StatusChecker)
    Task.Factory.StartNew(AddressOf LongRunningProcess).ContinueWith(AddressOf FinishProcess)

End Sub
因此,当这些都运行时,我们会让后台线程运行长任务,并根据需要经常检查状态。由于存储过程正在使用信息更新Table1,并在不同的事务中执行这些语句,因此您可以在更新发生时看到它们