Holen Sie sich einen einzelnen Datensatz aus der SQL-Server den richtigen Weg
Ich bin mit Ado zum abrufen eines einzelnen Datensatzes durch id. Beachten Sie:
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;
}
}
}
Wie Sie sehen können ich bin mit Während der Iteration durch die Datensätze. Da während der ist, was bedeutet, dass es möglicherweise mehr als einen Datensatz zu iterieren, ich glaube, dass dies möglicherweise der falsche Weg, um einen einzigen Datensatz. Angesichts ADO hat ExecuteScalar für eine Zeile ein Feld vielleicht haben Sie einen festgelegten Weg für eine Zeile mehrere Felder. Gibt es einen festgelegten Weg, um einen einzelnen Datensatz in ADO?
Natürlich es wird funktionieren, aber um klar zu machen, wer Sie Lesen Ihre source-code, den Sie ersetzen können
Die ExecuteScalar-Methode ist nur eine bequeme Methode, liefert die erste Spalte der ersten Zeile des ersten resultset. Also, wenn Sie können das gleiche tun für mehrere Spalten ausführen einmal Gelesen werden, überprüfen Sie das Ergebnis true, und schließen Sie den Leser sofort.
while(reader.Read())
mit if (reader.Read())
und (eventuell hinzufügen TOP 1
zu Ihrem SELECT
im Fall von SQL Server aktivieren des query-Optimierung, weil, dass). Nehmen Sie auch einen Blick auf LINQ .Single()
Umsetzung (für SQL-oder EF) für einige inspiration.Die ExecuteScalar-Methode ist nur eine bequeme Methode, liefert die erste Spalte der ersten Zeile des ersten resultset. Also, wenn Sie können das gleiche tun für mehrere Spalten ausführen einmal Gelesen werden, überprüfen Sie das Ergebnis true, und schließen Sie den Leser sofort.
InformationsquelleAutor Luke101 | 2015-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde gehen Sie mit Ihrem aktuellen Ansatz, außer, dass ich würde beseitigen die while-Schleife. Wenn Sie sicherstellen möchten, dass nur ein Datensatz zurückgegeben wird, führen Sie eine zusätzliche
Read
um sicherzustellen, dass es false zurück. Dies ist ähnlich wie die Semantik von LINQSingle
Betreiber.Unter der Annahme, dass die
id
Spalte in der Datenbank wird ein Primärschlüssel (unique), es gibt keine Notwendigkeit, geben Sie eineTOP
- Klausel in der SQL-Abfrage, die SQL Server-Abfrageoptimierer würde folgern, dass nur höchstens ein Datensatz zurückgegeben wird aufgrund derWHERE
- Klausel. Allerdings, wenn Sie nicht über einen Primärschlüssel oder einen eindeutigen index/constraint auf dieid
Spalte, dann sollten Sie eineTOP (2)
- Klausel zum einschränken der Anzahl der zurückgegebenen Zeilen. Sie sollten vermeiden Sie die VerwendungTOP (1)
denn wäre Sie nicht in der Lage zu erkennen (und ein Fehler) weitere Spiele.TOP
ohneORDER BY
moot - was "top 2" sind Sie immer auf??? Es sei denn, Sie explizit definieren einORDER BY
, die Reihenfolge (und damit die "ersten zwei Zeilen") ist willkürlich....Sie kümmern sich nicht, die zwei die Sie bekommen, solange Sie in der Lage zu bestätigen, dass Sie in der Tat immer zwei. (Sie werden eine Ausnahme werfen und legen Ihre Inhalte sowieso.) Entity Framework verwendet die gleiche Vorstellung bei der Umwandlung
Single()
zu SQL.InformationsquelleAutor Douglas
Was ist, wenn Sie nur einmal gelesen:
P. S.: habe ich auch geändert-select-Anweisung wählen Sie nur die erforderlichen Felder aus und wickelte Leser in der using-Anweisung.
InformationsquelleAutor Eugene Podskal
Können Sie
Top(1)
in diesem Fall in der Abfrage, um nur die einzigen Datensatz aus der Datenbank:TOP
ohneORDER BY
moot - was "top 1" sind Sie immer auf??? Es sei denn, Sie explizit definieren einORDER BY
, die Reihenfolge (und damit die "erste Zeile") ist willkürlich....Sie überzeugt, der Arme Kerl hinzufügen einer redundanten order by-Klausel, um seine Abfrage!
es ist NICHT überflüssig ....
Lesen Sie seine Abfrage
InformationsquelleAutor Ehsan Sajjad