我正在运行一个存储过程,在一个巨大的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
3条答案
按热度按时间rqqzpn5f1#
该存储过程的结果在第一行第一列中。
属性Rows.Count在此上下文中始终返回1,因为它的用途是计算DataTable中存在的行数
所以你的代码应该简单
正如注解中所指出的,当您只需要一个标量值(如COUNT、SUM或任何单行/单列查询返回的标量值)时,您应该考虑使用ExecuteScalar。它的效率要高得多,因为它不需要构建DataSet、DataTable以及支持这些对象所需的所有基础结构。
w8f9ii692#
你应该试试这个。因为它将是第一个第一个表格的第一行和第一列。
我建议最好使用ExecuteScalar或DatabaseExecuteScalar,如果你只想检索一个值。数据集是沉重的。数据集是要用在我们必须获得数据表的形式,我们需要读/写数据集。
fquxozlt3#
如果您希望使用现有的实现,为什么要使用
ds.Tables[0].Rows.Count
?在
ds.Tables[0].Rows[0][0]
处停止,这将直接给予行中的项。确保进行了转换/强制转换。因为存储过程已经给出了计数。