如何在 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
}
我正在从我的桌面应用程序调用一个存储过程,该存储过程 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
}