如何在 C# 中从具有多个 returns 的存储过程中获取剩余输出

How to get Remaining outputs from stored procedure with multiple returns in C#

我正在从我的桌面应用程序调用一个存储过程,该存储过程 returns 有多个结果。

但是当我将结果存储到数据表中时,只有第一个结果被填充。
谁能帮我解决这个问题。

我使用的存储过程是:

ALTER PROCEDURE [dbo].[InsertIntoUserLogsAndImageArchive]
    @UserName NVARCHAR(50), 
    @CompUserName NVARCHAR(50), 
    @CompName NVARCHAR(50), 
    @DateTime NVARCHAR(50),
    @EAN NVARCHAR(50), 
    @Path NVARCHAR(50),
    @FileName NVARCHAR(50),
    @BatchId NVARCHAR(50)
AS
BEGIN
    DECLARE @ULId NVARCHAR(50), @AId NVARCHAR(50)

    INSERT INTO [UserLogs] (UserName, CompUserName, CompName, DateTime) OUTPUT INSERTED.ULId --into @ULId 
    VALUES (@UserName, @CompUserName, @CompName, @DateTime);

    SELECT @ULId = SCOPE_IDENTITY();

    INSERT INTO [ImagesArchive] (EAN, Path, FileName, BatchId, ULId) 
    OUTPUT INSERTED.AId 
    VALUES (@EAN, @Path, @FileName, @BatchId, @ULId);

    SELECT @AId = SCOPE_IDENTITY();

    SELECT ULId, AId 
    FROM ImagesArchive 
    WHERE AId = @AId;
END

接收数据的代码片段为:

public DataTable ExecuteQuery2(string storedProcedureName, List<SqlParameter> param)
{
    DataTable dt = new DataTable();

    using (SqlConnection cn = GetConnection(""))
    {
        using (SqlCommand cmd = cn.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = storedProcedureName;
            cmd.Parameters.AddRange(param.ToArray());                    

            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                da.Fill(dt);
            }
        }
    }
    return dt;
}

正在执行以下存储过程returns:

我想在我的 DataTable 中获取最后一个结果而不是第一个结果。虽然我还有其他选择,但我真的很想接受这个。

请帮忙!

如果你可以使用数据读取器

datatable1.Load(reader)
reader.NextResult();
datatable2.Load(reader)

获取下一个 table 数据。

这应该允许您依次命中每个结果集。

您可以使用 dataset 而不是 datatable。所以你在 c# 中更新的代码将是

public DataSet ExecuteQuery2(string storedProcedureName, List<SqlParameter> param)
{
    DataSet ds = new DataSet();
    using (SqlConnection cn = GetConnection(""))
    {
        using (SqlCommand cmd = cn.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = storedProcedureName;
            cmd.Parameters.AddRange(param.ToArray());                    

            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                da.Fill(ds);
            }
        }
    }
    return ds;
}

通过这种方式,您可以 return 您程序中的所有记录 return。

如果你想发送特定的DataTable,那么你可以这样更新。

public DataTable ExecuteQuery2(string storedProcedureName, List<SqlParameter> param)
{
    DataSet ds = new DataSet();

    using (SqlConnection cn = GetConnection(""))
    {
        using (SqlCommand cmd = cn.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = storedProcedureName;
            cmd.Parameters.AddRange(param.ToArray());                    

            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                da.Fill(ds);
            }
        }
    }

    return ds.Tables[0];   //// here instead of 0 you may pass the table number you want to return
}