从C#中的DataSet中提取存储过程COUNT结果

时间:2016-10-27 19:20:29

标签: c# sql-server stored-procedures

我正在运行一个存储过程,在巨大的COUNT上返回SELECT的结果。

我发现自己在我的C#代码中有一个DataSet,但经过多次尝试后,我无法提取COUNT的结果。

这是我的代码,您可以忽略长存储过程最后它只是一个COUNT (*),但它就是以防万一。

C#代码:

internal int ObtenirCount(string ProcedureName, IConnexionBD _ConnexionBD, params SqlParameter[] parametres)
{
    int count = 0;
    IConnexionBD _ConnBd = _ConnexionBD ?? new ConnexionBD(ObtenirChaineDeConnexion());

    DataSet ds = _ConnBd.ExecuteDataSet(string.Format(ProcedureName, NomTable), parametres);

    if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
    {
        count = ds.Tables[0].Rows.Count; // Doesn't work
    }
    return count;
}

存储过程:

ALTER PROCEDURE [dbo].[PSS_us_net_010]
@PageSize int,
@PageNumber int,
@filtreType varchar,
@filtrePrincipal varchar,
@filtreNumUtilisateur varchar,
@filtreNom varchar,
@filtreCourriel varchar, 
@filtreCompteCentral varchar,
@sortColumnUser varchar

AS

DECLARE @Sort char(35)
DECLARE @StartRow int
DECLARE @strFiltreType varchar(100) = ''
DECLARE @strFiltrePrincipal varchar(100) = ''
DECLARE @strFiltreNumUtilisateur varchar(100) = ''
DECLARE @strFiltreNom varchar(100) = ''
DECLARE @strFiltreCourriel varchar(100) = ''
DECLARE @strFiltreCompteCentral varchar(100) = ''
DECLARE @strSortColUser varchar(100) = ''

SET @StartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))
IF @filtreType != ''
    BEGIN
        SET @strFiltreType = @filtreType
    END
IF @filtrePrincipal != ''
    BEGIN
    IF @filtrePrincipal = 'o' OR  @filtrePrincipal = 'u' OR @filtrePrincipal = 'i' OR @filtrePrincipal = 'ou' OR @filtrePrincipal= 'oui' OR @filtrePrincipal = 'ui'
        SET @strFiltrePrincipal = 00
    ELSE 
        SET @filtrePrincipal = NULL
    END
IF @filtreNumUtilisateur != ''
    BEGIN
        SET @strFiltreNumUtilisateur = @filtreNumUtilisateur
    END
IF @filtreNom != ''
    BEGIN
        SET @strFiltreNom = @filtreNom
    END
IF @filtreCourriel != ''
    BEGIN
        SET @strFiltreCourriel = @filtreCourriel
    END
IF @filtreCompteCentral != ''
    BEGIN
        SET @strFiltreCompteCentral = @filtreCompteCentral
    END
IF @sortColumnUser != ''
    BEGIN
        SET @strSortColUser = @sortColumnUser
    END

BEGIN

    SELECT COUNT(*)FROM
    (
   SELECT
     ty_util_net,
     ident_util_net,
     no_usager_net,
     nip,
     nip_temporaire,
     adr_courriel,
     dte_creer,
     dte_modif,
     dte_dern_utilisation,
     hre_dern_utilisation,
     nb_visites,
     nom_prenom,
     dte_avant_dern_util,
     hre_avant_dern_util,
     adr_courriel_erronee,
     phrase_mot_passe,
     nom_navigateur,
     version_navigateur,
     date_env_courriel,
     ChoixAucunePhrase,
     EnvoiCourriel,
     DetCCReg,
     IndAffPhrase
   FROM us_net
    WHERE nom_prenom >= @Sort 
    AND(@filtreType IS NULL OR ty_util_net LIKE '%' + @strFiltreType + '%')
    AND(@filtrePrincipal IS NULL OR no_usager_net LIKE '%' + @strFiltrePrincipal + '%')
    AND(@filtreNumUtilisateur IS NULL OR ident_util_net LIKE '%' + @strFiltreNumUtilisateur + '%')
    AND(@filtreNom IS NULL OR nom_prenom LIKE '%' + @strFiltreNom + '%')
    AND(@filtreCourriel IS NULL OR adr_courriel LIKE '%' + @strFiltreCourriel + '%')
) AS countResult 
END

3 个答案:

答案 0 :(得分:2)

该存储过程的结果位于第一行第一列 Rows.Count属性在此上下文中始终返回1,因为它的目的是计算DataTable中存在的行数

所以你的代码应该只是

count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);

如注释中所述,当您只需要像COUNT,SUM或任何单行/单列查询返回的标量值时,您应该考虑使用ExecuteScalar。它效率更高,因为它不需要构建DataSet,DataTables以及支持这些对象所需的所有基础结构。

答案 1 :(得分:1)

如果您希望使用现有的实施,为什么要使用ds.Tables[0].Rows.Count

只需停留在ds.Tables[0].Rows[0][0],这将直接为您提供该行中的项目。确保你转换/施放。由于存储过程已经给出了计数。

答案 2 :(得分:1)

count = Convert.ToInt32(ds.Tables[0].Rows[0][0]);

你应该试试这个。因为它将是第一个第一个表第一行和第一列。

如果您只想查询单个值,我建议您更好地使用ExecuteScalarDatabaseExecuteScalar。 DataSet很重。 DataSet用于我们必须以表格形式获取数据的地方,我们需要读取/写入DataSet。