J'ai une API en C# qui retourne des données d'un DB et un frontend qui peint ces données dans une table.C# Write Async une taille de données spécifique
Mon approche consistait à lire les données de la base de données avec un sqlReader, itérer à travers ce lecteur en ajoutant chaque résultat à une liste et renvoyer cette liste au frontend.
Semble assez facile, jusqu'à ce que je reçoive des données de requête massives. Ma solution était de retourner ce bloc de données par morceau, mais je suis coincé avec elle, c'est le code que je travaille avec:
var sqlCommand = db.InitializeSqlCommand(query);
try
{
using (var reader = sqlCommand.ExecuteReader())
{
var results = new List<List<string>>();
var headers = new List<string>();
var rows = new List<string>();
for (var i = 0; i < reader.FieldCount; i++)
{
headers.Add(reader.GetName(i));
}
results.Add(headers);
while (reader.Read())
{
for (var i = 0; i < reader.FieldCount; i++)
{
rows.Add((reader[reader.GetName(i)]).ToString());
}
results.Add(rows);
var str = JsonConvert.SerializeObject(results);
var buffer = Encoding.UTF8.GetBytes(str);
//Thread.Sleep(1000);
await outputStream.WriteAsync(buffer, 0, buffer.Length);
rows.Clear();
results.Clear();
outputStream.Flush();
}
}
}
catch (HttpException ex)
{
if (ex.ErrorCode == -2147023667) // The remote host closed the connection.
{
}
}
finally
{
outputStream.Close();
db.Dispose();
}
Avec cela, je suis en mesure de renvoyer des données un par un (testé avec le Thread.sleep), mais je suis coincé sur la façon de retourner un montant spécifique, disons 200 données ou 1000, cela ne devrait vraiment pas avoir d'importance.
Une idée sur la façon de procéder? Merci d'avance. Mese.
Comment utiliser 'OFFSET' et' FETCH NEXT' dans votre commande SQL? Vous pouvez augmenter le 'OFFSET' pour chaque exécution suivante. Exemple - après la clause ORDER BY ajouter 'OFFSET 200 ROWS FETCH NEXT 200 ROWS SEULEMENT' pour ignorer 200 lignes et obtenir les 200 prochaines – degant
Ce n'est pas une possibilité, c'est une requête dynamique, je ne suis pas censé savoir quelle requête arrive. C'est pourquoi je veux que tout soit dynamique – Mese
Donc vous n'avez pas de contrôle sur la requête. Ensuite, le seul moyen est de contrôler le nombre de lignes que le lecteur lit. Que diriez-vous de 'foreach (var row dans reader.AsEnumerable.Skip (200).Prenez (200)) {// opération} 'et vous pouvez modifier le 200 dans les appels suivants – degant