簡體   English   中英

從存儲過程調用前缺少選擇

[英]Missing select before call from stored procedure

我在相同的存儲過程中有兩個選擇

SELECT
    FORMAT(AVG([DC].[ContractedAmount]) , '$###,###,###,###.##') AS [AverageContractedAmount],
    FORMAT(MAX([DC].[ContractedAmount]) , '$###,###,###,###.##') AS [MaxContractedAmount],
    FORMAT(MIN([DC].[ContractedAmount]) , '$###,###,###,###.##') AS [MinContractedAmount],
    COUNT([DC].[ContractedAmount]) AS [TotalProjects]
FROM 
    [DesignCustomer] AS [DC]
INNER JOIN 
    [Design] AS [D] ON [DC].[DesignKey] = [D].[DesignKey]
INNER JOIN 
    [Task] AS [T] ON [D].[DesignKey] = [t].[DesignKey]
INNER JOIN 
    [ProjectDesign] AS [PD] ON [D].[DesignKey] = [PD].[DesignKey]
INNER JOIN 
    [Project] AS [P] ON [PD].[ProjectKey] = [P].[ProjectKey]
INNER JOIN 
    [Address] AS [A] ON [A].[AddressGuid] = [P].[ProjectGuid]
WHERE ...

SELECT
    CONCAT([P].[LegacyKey] , ' ' , [P].[Name]) AS [Project],
    CONCAT([D].[Name] , ' ' , [DT].[Abbreviation] , ' ' , [D].[DesignNumber]) AS [Design],
    FORMAT([DC].[ContractedAmount] , '$###,###,###,###.##') AS [Amount],
    [P].[NumberOfUnits] AS [Units]
FROM 
    [DesignCustomer] AS [DC]
INNER JOIN 
    [Design] AS [D] ON [DC].[DesignKey] = [D].[DesignKey]
INNER JOIN 
    [DesignType] AS [DT] ON [D].[DesignTypeGuid] = [DT].[DesignTypeGuid]
INNER JOIN 
    [Task] AS [T] ON [D].[DesignKey] = [t].[DesignKey]
INNER JOIN 
    [ProjectDesign] AS [PD] ON [D].[DesignKey] = [PD].[DesignKey]
INNER JOIN 
    [Project] AS [P] ON [PD].[ProjectKey] = [P].[ProjectKey]
INNER JOIN 
    [Address] AS [A] ON [A].[AddressGuid] = [P].[ProjectGuid]
WHERE ...

我進入C#到Datatable中是:

public DataTable ExeSQLEstimate(string sprocName, parameters... )
{
    SqlCommand cmd = new SqlCommand(sprocName, this.dbconn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("@MinWoodStories", SqlDbType.Int).Value = minWoodStories;
    //etc

    DataTable tbl = new DataTable("Table1")
        {
            Locale = System.Globalization.CultureInfo.InvariantCulture
        };

    SqlDataAdapter da = new SqlDataAdapter(cmd);

    try
    {
        da.Fill(tbl);
    }
    catch (SqlException e)
    {
        this.HandleSQLError(e, "GetTableBySQL", sprocName);
    }
    finally
    {
        cmd.Dispose();
    }

    return tbl;
}

但由於某種原因,我只能得到一行(第一次選擇),而不是兩行(每次選擇一個)

在此處輸入圖片說明

為什么只返回一行? 問候

您的過程返回多個結果集,每個結果集將存儲在單獨的DataTable中。 您要填充數據集而不是數據表。 然后,您的數據集將具有2個數據表,其中包含過程的結果,您可以索引到DataSet.DataTables屬性中以訪問數據。

這是一個簡單的示例, p_MultipleResultsProc返回2個結果集,例如您的過程:

DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
using (SqlCommand cmd = new SqlCommand("EXEC p_MultipleResultsProc", conn))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
    da.Fill(ds);
}

執行后, ds將包含2個DataTable,每個DataTable包含過程調用中不同的結果集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM