SQL Server 用C#从数据集中提取存储过程COUNT结果

yvfmudvl  于 2023-01-16  发布在  C#
关注(0)|答案(3)|浏览(223)

我正在运行一个存储过程,在一个巨大的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
rqqzpn5f

rqqzpn5f1#

该存储过程的结果在第一行第一列中。
属性Rows.Count在此上下文中始终返回1,因为它的用途是计算DataTable中存在的行数
所以你的代码应该简单

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

正如注解中所指出的,当您只需要一个标量值(如COUNT、SUM或任何单行/单列查询返回的标量值)时,您应该考虑使用ExecuteScalar。它的效率要高得多,因为它不需要构建DataSet、DataTable以及支持这些对象所需的所有基础结构。

w8f9ii69

w8f9ii692#

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

你应该试试这个。因为它将是第一个第一个表格的第一行和第一列。
我建议最好使用ExecuteScalarDatabaseExecuteScalar,如果你只想检索一个值。数据集是沉重的。数据集是要用在我们必须获得数据表的形式,我们需要读/写数据集。

fquxozlt

fquxozlt3#

如果您希望使用现有的实现,为什么要使用ds.Tables[0].Rows.Count
ds.Tables[0].Rows[0][0]处停止,这将直接给予行中的项。确保进行了转换/强制转换。因为存储过程已经给出了计数。

相关问题