0
votes

Comment obtenir les valeurs de la requête de sélection de la procédure stockée en c #

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;
}


1 commentaires

Note mineure: il n'y a pas besoin d'une table temporaire ici; il suffit de sélectionner dans les tables source?


3 Réponses :


1
votes

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.


0 commentaires

1
votes

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


0 commentaires

1
votes

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();
}


0 commentaires