Sto utilizzando Ado per recuperare un singolo record tramite id. Osservare:Ottenere un singolo record da SQL Server nel modo corretto
public async Task<Image> GetImage(int id)
{
var image = new Image();
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
conn.Open();
string sql = @" SELECT * FROM Images where id = @id";
using (SqlCommand comm = new SqlCommand(sql, conn))
{
comm.Parameters.AddWithValue("@id", id);
var reader = await comm.ExecuteReaderAsync();
int ordId = reader.GetOrdinal("id");
int ordName = reader.GetOrdinal("name");
int ordPath = reader.GetOrdinal("path");
while (reader.Read())
{
image.Id = reader.GetInt32(ordId);
image.Name = reader.GetString(ordName);
image.Path = reader.GetString(ordPath);
}
return image;
}
}
}
Come si vede Sto usando mentre per scorrere tra i record. Dal momento che è significativo che ci sia più di un record per iterare, credo che questo possa essere il modo sbagliato per ottenere un singolo record. Considerando che ADO ha ExecuteScalar per un campo di una riga, è possibile che abbiano un modo specifico per campi multipli di una riga. Esiste un modo specifico per ottenere un singolo record in ADO?
Ovviamente funzionerà così com'è, ma per chiarire a chi leggerà il codice sorgente è possibile sostituire 'while (reader.Read())' con 'if (reader.Read())' e (eventualmente aggiungi 'TOP 1' al tuo' SELECT', nel caso in cui SQL Server abiliti l'ottimizzazione della query a causa di ciò). Date anche un'occhiata a LINQ '.Single()' implementazione (per SQL o EF) per qualche ispirazione. –
Il metodo ExecuteScalar è solo un metodo di convenienza che restituisce la prima colonna della prima riga del primo gruppo di risultati. Quindi, se puoi fare la stessa cosa per più colonne eseguendo Leggi una volta, verifica un risultato vero e chiudi immediatamente il lettore. –