Je veux la date et le nom de la requête de sélection qui, si je l'exécute comme une requête normale, j'obtiens les résultats, mais lorsque j'essaye d'obtenir les résultats en C #, tout ce que j'obtiens est count = 0 . Quelqu'un peut-il me dire ce que je fais mal?
Voici le code C #
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetLastAccessedCertificationData]
(@taskOwner nvarchar(255))
AS
BEGIN
DECLARE @name nvarchar(100)
DECLARE @lastAccessedDate [datetime]
SELECT @name = Name
FROM CertificationReviewCycles
INNER JOIN UserReviewCycleAccess ON CertificationReviewCycles.CertificationReviewCycleID = UserReviewCycleAccess.LastAccessedReviewCycleID
WHERE USERID = @taskOwner
SELECT @lastAccessedDate = LastAccessedDate
FROM UserReviewCycleAccess
WHERE UserID = @taskOwner
CREATE TABLE #tempTable
(
name [nvarchar](255) NULL,
[LastAccessedDate] [datetime] NULL,
)
INSERT INTO #tempTable VALUES (@name, @lastAccessedDate)
SELECT TOP(1) name, LastAccessedDate
FROM #tempTable
END
GO
Et voici la procédure stockée:
private List<CertificationSummary> GetLastAccessData (string taskOwner)
{
List<CertificationSummary> lastAccessedResult = new List<CertificationSummary>();
string connectionString = SqlPlusHelper.GetConnectionStringByName("MetricRepositoryDefault");
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlParameter[] sqlParams = new SqlParameter[1];
sqlParams[0] = new SqlParameter("@taskOwner", SqlDbType.NVarChar);
sqlParams[0].Value = taskOwner;
connection.Open();
SqlCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "GetLastAccessedCertificationData";
cmd.Parameters.AddRange(sqlParams);
cmd.ExecuteNonQuery();
}
return lastAccessedResult;
}
3 Réponses :
Vous renvoyez lastAccessedResult qui vient d'être défini sur new List . Cette liste ne contient aucun élément, elle a donc un décompte de 0.
Utilisez ExecuteReader au lieu de ExecuteNonQuery et vous pouvez ensuite lire les données renvoyées et les stocker dans votre liste lastAccessedResult .
Lisez ici pour plus d'informations.
ExecuteNonQuery ne retournera pas de résultats et ne doit être utilisé que lorsque vous n'attendez pas de retour de lignes. Ceci est courant pour les instructions UPDATE.
Puisque vous souhaitez lire les lignes renvoyées par la procédure stockée, utilisez ExecuteReader, par exemple var reader = cmd.ExecuteReader ();
Cliquez ici pour en savoir plus: https: //docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldatareader?view=dotnet-plat-ext-3.1
Vous utilisez ExecuteNonQuery , qui supprime toutes les grilles de la requête. Vous devez utiliser ExecuteReader pour consommer des grilles, mais c'est beaucoup de désordre et de cérémonie - l'API est verbeuse. Franchement, je recommanderais un outil comme "Dapper" (disponible gratuitement sur NuGet), alors cela devient juste
private List<CertificationSummary> GetLastAccessData (string taskOwner)
{
string connectionString = SqlPlusHelper.GetConnectionStringByName("MetricRepositoryDefault");
using var connection = new SqlConnection(connectionString);
return connection.Query<CertificationSummary>(
"GetLastAccessedCertificationData",
new { taskOwner }, // <== parameters
commandType: CommandType.StoredProcedure).AsList();
}
Note mineure: il n'y a pas besoin d'une table temporaire ici; il suffit de sélectionner dans les tables source?