正在从C#中的数据集中提取存储过程COUNT结果

本文关键字:提取 集中 存储过程 COUNT 结果 数据集 数据 | 更新日期: 2023-09-27 18:15:28

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

我发现我的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

正在从C#中的数据集中提取存储过程COUNT结果

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

所以你的代码应该是简单的

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

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

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

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

如果您只想检索单个值,我建议您最好使用ExecuteScalar或DatabaseExecute Scalar。数据集很重。数据集用于必须以表形式获取数据并且需要读取/写入数据集的地方。

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

只需在ds.Tables[0].Rows[0][0]处停止,这将直接为您提供行中的项目。请确保转换/强制转换。由于存储过程已经在进行计数。