首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 存儲過程多條 SELECT 返回多結果集給 .NET DataSet

     編輯:程式設計綜合問答

現象

存儲過程中只有幾條 SELECT 語句,無 INSERT/UPDATE,Oracle 中無意義,但 SQL Server 中常見。

原因:.NET DataAdapter.Fill(DataSet) 自動映射多結果集

CREATE PROC GetDashboardData
AS
BEGIN
    SELECT * FROM Sales WHERE Year = 2023;      -- 結果集 0
    SELECT * FROM TopCustomers;                 -- 結果集 1
    SELECT COUNT(*) AS TotalOrders FROM Orders; -- 結果集 2
END

C# 調用:

var ds = new DataSet();
using (var da = new SqlDataAdapter("GetDashboardData", conn)) {
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
    da.Fill(ds); // ds.Tables[0] = Sales, [1] = TopCustomers, [2] = TotalOrders
}

優點

  • **單次往返**獲取多個相關數據集,減少網絡延遲。
  • **原子性讀取**:所有查詢在同一事務快照下(若隔離級別允許),數據一致。
  • 簡化 .NET 代碼:無需多次 Fill 或多個命令。

Oracle 遷移對應方案

SQL ServerOracle 等效
多 SELECT 存儲過程包含 SYS_REFCURSOR OUT 參數的 Package/Procedure
DataAdapter.Fill(DataSet)OracleDataAdapter.Fill(DataSet) 自動映射 REF CURSOR 到 Tables
-- Oracle Package
CREATE OR REPLACE PACKAGE PKG_DASH AS
  PROC_GET_DATA (
    p_sales OUT SYS_REFCURSOR,
    p_cust  OUT SYS_REFCURSOR,
    p_ord   OUT SYS_REFCURSOR
  );
END;

-- C# 調用
cmd.Parameters.Add("p_sales", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
// ... da.Fill(ds) 自動生成 ds.Tables[0], [1], [2]

注意事項

  • 結果集順序**嚴格對應** SELECT 順序,修改存儲過程時同步調整 .NET 索引。
  • 大結果集考慮分頁或流式讀取 (ExecuteReader + NextResult()) 避免內存壓力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved