Отсутствует выбор перед вызовом из хранимой процедуры - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два выбора в одной и той же хранимой процедуре, как

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;
}

, но по какой-то причине я получаю только одну строку (сначалаselect) вместо двух (по одному на выбор)

enter image description here

Почему возвращается только одна строка?Привет

1 Ответ

0 голосов
/ 12 сентября 2018

Ваша процедура возвращает несколько наборов результатов, каждый из которых будет сохранен в отдельном DataTable.Вы хотите заполнить DataSet вместо DataTable.Тогда ваш DataSet будет иметь 2 DataTable, которые содержат результаты вашей процедуры, и вы можете индексировать в свойство 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 таблицы данных, каждая из которых содержит различные наборы результатов из вашего вызова процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...