正在从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
该存储过程的结果在第一行,第一列中
属性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]
处停止,这将直接为您提供行中的项目。请确保转换/强制转换。由于存储过程已经在进行计数。