Comment stocker un résultat SQL dans une variable en C # en utilisant Dapper.NET

c# dapper sqlconnection

Question

J'utilise dans mon projet, un bel outil pour stocker les résultats de la SQL query dans une List et cela fonctionne bien.

J'ai écrit une SQL query pour extraire un enregistrement de la base de données et stocker le résultat dans une variable. J'ai essayé d'utiliser dapper mais j'ai eu une erreur. J'ai collé le code correspondant.

Exception: Impossible de convertir l'objet de type 'System.Collections.Generic.List`1 [Dapper.SqlMapper + DapperRow]' pour taper 'System.IConvertible'.

try
{
  using(var connection = ...)
  {
   connection.Open();
   const string masterSelectQuery = "SELECT Id as [fileId], FileName as [fileName], Frequency as [frequency], Scheduled_Time as scheduledTime FROM MASTER_TABLE";
   masterTableList = connection.Query<MasterTableAttributes>(masterSelectQuery).ToList();//Working fine

   const string lastProcessedTimeQuery = "SELECT TOP 1 file_transfered_time as [lastProcessedTime] FROM PROCESS_LOGS ORDER BY file_transfered_time DESC";
   DateTime lastProcessedTime = Convert.ToDateTime(connection.Query(lastProcessedTimeQuery)); //Here it fails
  }    
}

Pour surmonter cette erreur, j'ai utilisé SQLCommand comme suit

using (command = new SqlCommand(lastProcessedTimeQuery, connection))
{
  DateTime lastProcessedTime = (DateTime)command.ExecuteScalar();//working fine  
}

Je fais une erreur en utilisant dapper, quelqu'un peut-il me guider?

Merci d'avance.

Réponse acceptée

connection.Query(lastProcessedTimeQuery) renvoie une séquence de lignes , chacune individuellement dynamic . En supposant que file_transfered_time soit un datetime , vous avez deux choix ici:

DateTime lastProcessedTime = connection.Query<DateTime>(
                 lastProcessedTimeQuery).Single();

ou, pour montrer comment Query non générique fonctionne avec une ligne dynamic :

DateTime lastProcessedTime = connection.Query(
                 lastProcessedTimeQuery).Single().lastProcessedTime;

Si votre table PROCESS_LOGS pouvait être vide, vous pourriez préférer SingleOrDefault :

DateTime? lastProcessedTime = connection.Query<DateTime?>(
                 lastProcessedTimeQuery).SingleOrDefault();

ou:

var row = connection.Query(lastProcessedTimeQuery).SingleOrDefault();
DateTime? lastProcessedTime = null;
if(row != null) lastProcessedTime = row.lastProcessedTime;



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi