从 C# 中的存储过程返回多个记录集

     2023-02-22     284

关键词:

【中文标题】从 C# 中的存储过程返回多个记录集【英文标题】:Return multiple recordsets from stored proc in C# 【发布时间】:2013-09-01 21:13:23 【问题描述】:

我必须将 ASP 经典系统转换为 C#

我有一个存储过程,最多可以返回 7 个记录集(取决于传入的参数)。

我需要知道如何简单地将所有记录集作为单独的 DataTables 返回,这样我就可以遍历所有的数据表,当我到达它的末尾时跳到下一个 DataTable,而不必运行多个 SQL 语句并使用多个适配器。填充语句将每个表添加到数据集中。

在经典中,当我到达循环末尾以移至下一条语句时,这是一个简单的 Do While not objRS.EOF 循环,带有 objRS.NextRecordset()。

有什么我可以使用而不需要完全重写当前后端代码的东西吗?

每个记录集都有不同数量的列和行。它们彼此无关。我们从存储过程中返回多个记录集以减少流量。

例子会很好。

谢谢

【问题讨论】:

【参考方案1】:

这将返回你所需要的一切

using (SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString))

    using (SqlCommand cmd = new SqlCommand())
    
        cmd.CommandText = "yoursp";
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;

        conn.Open();

        SqlDataAdapter adapter = new SqlDataAdapter(cmd);

        DataSet ds = new DataSet();
        adapter.Fill(ds);

        conn.Close();
    

【讨论】:

这是我用来从存储过程中获取多个记录集的方法。为了澄清起见,记录集存储在ds.Tables 中,您可能希望将DataSet ds = new DataSet(); 放在开头,以便可以在using (SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString)) 块之外引用它。只是一个想法。 是的,您可以将其移出。只是举一个例子来说明如何做到这一点;。【参考方案2】:

如果您使用SqlDataAdapter.Fill() 方法填充数据集,那么从存储过程返回的每个记录集都将作为数据集中的数据表返回

DataSet dataset = new DataSet();
using (var adapter = new SqlDataAdapter("yourStoredProcedure", yourConnectionString))

    adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
    adapter.Fill(dataset);

for (int i = 0; i < dataset.Tables.Count; i++)

    // Do something for each recordset

如果您使用 SqlDataReader 则可以使用 SqlDataReader.NextResult() 方法前进到下一个记录集:

using (var connection = new SqlConnection(yourConnectionString))
using (var command = new SqlCommand("yourStoredProcedure"))

    connection.Open();
    using (var reader = command.ExecuteReader())
    
        while (reader.Read())
        
            // do something with first result set;
        
        if (reader.NextResult())
        
            while (reader.Read())
            
                // do something with second result set;
            
        
        else
        
            return;
        
        if (reader.NextResult())
        
            while (reader.Read())
            
                // do something with third result set;
            
        
        else
        
            return;
        
    

【讨论】:

我从来不知道你可以使用SqlDataReader.ExecuteReader().NextResult() 获得多个结果集。感谢您的详细回答! 确实可以,我通常更喜欢使用 SqlDataReader,因为它只存储当前记录,而不用担心已经读取的内容和尚未读取的内容,从而降低了内存使用率。然而,this answer 将数据集与数据读取器进行比较有一个很好的类比。 感谢分享 SO 链接!我过去使用过SqlDataReaders,我认为需要维护很多代码。然后我尝试了DataTables 并认为它们要快得多。将来编写其他代码时,我将不得不牢记替代方案!再次感谢分享! 这就是我们所说的完美解决方案【参考方案3】:

您可以使用 if (dr.NextResult())

来检查 dr 是否有更多记录集 ot no

然后用 dr.read 再次循环

试试这个

string connStr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
SqlConnection Con = new SqlConnection(connStr);

try

    string str1 = "select productid,productname from products;select VendorFName from vendor";
    SqlCommand com = new SqlCommand(str1, Con);

    com.Connection.Open();

    SqlDataReader dr = com.ExecuteReader();

    DropDownList1.Items.Add("Select Product Id");
    DropDownList2.Items.Add("Select Vendor Name");

    while(dr.Read())
    
        DropDownList1.Items.Add(dr.GetValue(0).ToString());
    

    if (dr.NextResult())
    
        while (dr.Read())
        
            DropDownList2.Items.Add(dr.GetValue(0).ToString());
        
    

catch (Exception ex)


finally

    if (Con.State == ConnectionState.Open)
    
        Con.Close();
    

【讨论】:

【参考方案4】:
SqlConnection con=new SqlConnection("YourConnection String");
SqlCommand cmd=new SqlCommand();
SqlDataAdapter da=new SqlDataAdapter();
DataSet ds = new DataSet();
cmd = new SqlCommand("name of your Stored Procedure", con);
cmd.CommandType = CommandType.StoredProcedure;
//cmd.Parameters.AddWithValue("@SuperID", id);//if you have parameters.
da = new SqlDataAdapter(cmd);
da.Fill(ds);
con.Close();

在此之后,您可以利用不同的 (7) 记录集使用

ds.Tables[0]
ds.Tables[1]
ds.Tables[2]
ds.Tables[3]
ds.Tables[4]
ds.Tables[5]
ds.Tables[6]

【讨论】:

谢谢,我喜欢这个答案纯粹是因为我已经有一个带有包装函数的数据类,可以处理连接并在类被销毁时处理它们等。我只是想使用我拥有的现有函数并引用数据集中的表格。

Apache DbUtils:处理从存储过程返回的多个结果集

...:2016-08-0601:04:01【问题描述】:我在使用DbUtils从SQLServer中的存储过程中检索结果时遇到问题。在SQLServerManagementStudio中执行的存储过程在针对特定输入值执行时返 查看详情

从 Laravel 4 中的 MSSQL 存储过程读取多个结果集

】从Laravel4中的MSSQL存储过程读取多个结果集【英文标题】:ReadingmultipleresultsetfromMSSQLstoredprocedureinLaravel4【发布时间】:2014-04-2319:09:56【问题描述】:我正在从MSSQLServer2012中的存储过程中获取数据(使用SQLSRV驱动程序),它返回... 查看详情

Entity Framework 6 中具有多个记录集的存储过程

】EntityFramework6中具有多个记录集的存储过程【英文标题】:StoredprocedurewithmultiplerecordsetsinEntityFramework6【发布时间】:2021-12-2309:35:09【问题描述】:ASP.NETCore6WebAPI、EF6、C#、SQLServer2019。我知道如何执行返回记录集的存储过程,利... 查看详情

c#调用oracle带输出数据集的存储过程

1、创建一个带输出数据集的Oracle存储过程createorreplaceprocedurePRO_test(in_topinnumber,cur_outoutsys_refcursor)is--查询指定记录条数的数据,并返回总共记录数,返回多个数据集beginopencur_outforSELECT*FROMdept_dictwhererownum<in_top;endPRO_test; 查看详情

TOAD 显示存储过程返回的游标记录集

...设置结果。下面执行正常,但我需要看到结果。这是TOAD中的块,调用包spAMD_NEEDMSG:DECLARERETURN_RECORDSETCTI_MATRIX.AMD.REF_CUR 查看详情

从返回多个结果集的存储过程中插入临时表

】从返回多个结果集的存储过程中插入临时表【英文标题】:InsertIntotemptablefromastoredprocedurethatreturnsmultipleresultsets【发布时间】:2011-09-1707:48:22【问题描述】:考虑下面的sql一个名为myProc的存储过程,它返回两个结果集。结果集1... 查看详情

如何从内部调用获取记录集到存储过程?

】如何从内部调用获取记录集到存储过程?【英文标题】:Howtogetrecordsetfrominternalcalltostoredprocedure?【发布时间】:2016-10-0415:23:10【问题描述】:我有一个存储过程,在内部我想调用另一个返回记录集的过程,如何通过\'CALL\'导航... 查看详情

c#通过dataset获取sql存储过程返回的多个结果集(tables)(代码片段)

测试数据:Northwind链接地址: https://files.cnblogs.com/files/louiszh/NorthWind.zip首先创建一个测试存储过程:IFEXISTS(SELECT1FROMSYSOBJECTSWHEREid=object_id(‘pr_test‘))DROPPROCEDUREpr_testgoCREATEPROCEDUREpr_testASSELE 查看详情

如何将单个结果集从返回多个集的 SQL 存储过程保存到临时表?

】如何将单个结果集从返回多个集的SQL存储过程保存到临时表?【英文标题】:HowtosaveasingleresultsettoatemptablefromaSQLstoredprocedurereturningmultiplesets?【发布时间】:2009-10-0815:56:49【问题描述】:我需要将存储过程的结果集存储在临时... 查看详情

c#中两种不同的存储过程调用与比较

...或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数。根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程... 查看详情

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

】在实体框架数据库优先方法中,如何从存储过程返回多个结果集?【英文标题】:InEntityFrameworkdatabase-firstapproachhowtoreturnmultipleresultsetsfromastoredprocedure?【发布时间】:2015-05-2708:27:08【问题描述】:我正在使用数据库优先方法使... 查看详情

从 C# 中的存储过程中获取返回值

】从C#中的存储过程中获取返回值【英文标题】:GettingreturnvaluefromstoredprocedureinC#【发布时间】:2010-10-1622:07:29【问题描述】:我有以下疑问:setANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERPROCEDURE[dbo].[Validate]@avarchar(50),@bvarchar(50)outputASSET@Passw... 查看详情

从返回多个实际表的复杂存储过程中检索 asp.net MVC 中的数据

】从返回多个实际表的复杂存储过程中检索asp.netMVC中的数据【英文标题】:Retrievedatainasp.netMVCfromcomplexstoredprocedurewhichreturnmultipleactualtable【发布时间】:2022-01-2008:57:30【问题描述】:返回多个实际表作为结果集的用户定义存储过... 查看详情

如何从 adodb 记录集中访问存储过程中的变量?

】如何从adodb记录集中访问存储过程中的变量?【英文标题】:Howtoaccessvariableinstoredprocfromadodbrecordset?【发布时间】:2017-03-2418:50:26【问题描述】:我正在从我的存储过程中的前一个select语句返回记录计数。如果我使用此存储过... 查看详情

如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程中返回多个 SELECT 集

】如何使用FromSqlRawEntityFrameworkCore3.1从存储过程中返回多个SELECT集【英文标题】:HowtoreturnmultipleSELECTsetsfromastoredprocedureusingFromSqlRawEntityFrameworkCore3.1【发布时间】:2021-09-1004:43:17【问题描述】:我目前在从数据库返回值时遇到问... 查看详情

asp.net(c#)获取执行sqlserver语句/存储过程后的多个返回值?

...的个数,可以使用储存过程的输出(OUTPUT)参数。在定义存储过过程时为参数指定OUTPUT关键字。C#调用存储过程时指定参数SqlParameter对象的Direction属性为Output。如果是返回多个结果集的话,可以直接在存储过程中使用多个select查... 查看详情

存储过程返回到 C# .Net 中的 DataSet

】存储过程返回到C#.Net中的DataSet【英文标题】:StoredprocedurereturnintoDataSetinC#.Net【发布时间】:2012-10-1000:57:30【问题描述】:我想从存储过程中返回虚拟表,我想在c#.net的数据集中使用它。我的程序有点复杂,找不到如何返回表... 查看详情

具有多个结果集的nhibernate存储过程[重复](代码片段)

...有任何已知的解决方案让NHibernate使用返回多个结果集的存储过程?我正在开发一个项目,主管希望使用NHibernate,我们的dba只希望我们从存储过程中读取许多返回多个结果集的存储过程。我看起来像NHib 查看详情