Mam kodowane trzy instrukcje select w procedurze przechowywanej w Microsoft SQL Server 2005. Obie instrukcje select zwracają wiele rekordów i listę tabel dla instrukcji select jest inny. Jeden wybiera rekordy z tabeli głównej i drugi z tabeli podrzędnej. W kodzie C# chcę uzyskać wszystkie te rekordy i umieścić wszystkie dane w jednym obiekcie. Używam SqlDataReader. Czy to możliwe, czy powinienem zrobić coś innego?Jak korzystać z SqlDataReader, jeśli mam więcej niż jedną instrukcję select w procedurze przechowywanej
Odpowiedz
Używa się metody the NextResult na kontrolerze danych w celu nawigacji z wieloma wynikami z zapytania.
pętli wszystkich danych zrobiłbyś coś takiego:
var moreResults = true;
while (moreResults)
{
while (reader.Read())
{
...
}
moreResults = reader.NextResult();
}
Więc z tym jako tło, a zakładając resultset mistrz przychodzi pierwszy, zaludniając mistrzowskie i szczegóły obiektów można zrobić tak:
pierwsze, stworzenie słownika ewidencji Master:
var masters = new Dictionary<int, Master>();
var idOrdinal = reader.GetOrdinal("id");
while (reader.Read())
{
var id = reader.GetInt32(idOrdinal);
masters.Add(id, new Master{Id=id, ....});
}
Dalej przechodzimy do szczegółów tych zapisów i dodać do ich odpowiedniego suwaka:
reader.NextResult();
var masterIdOrdinal = reader.GetOrdinal("masterId");
while (reader.Read())
{
var masterId = reader.GetInt32(masterIdOrdinal);
var master = masters[masterId];
master.Details.Add(new Detail{....});
}
należy oczywiście wymienić nazwy kolumn z tego, co masz w swoich danych, a także dostarczyć pełnej inicjalizacji magisterskich i szczegółowości obiektów. Jeśli zestawienie szczegółów jest posortowane według wzorca, ostatnia pętla może być zoptymalizowana tak, aby wyszukiwała tylko jeden wzorzec raz ze słownika. Jeśli wyniki są małe, zysk nie będzie tak duży.
... dobrać rekordy z tabeli nadrzędnej i inne z tabeli podrzędnej .in kod C# Chcę dostać wszystko ten rekord i umieścić wszystkie dane w jednym obiekcie ...
Rozwiązanie Petera rozwiązuje podstawowy problem polegający na pobieraniu wielu wyników za pomocą pojedynczego DataReader
. Jeśli jednak chcesz zapisać dane w obiekcie, który replikuje relację między tabelami szczegółów nadrzędnych, powinieneś zamiast tego użyć wartości DataSet
.
Zestawy danych mogą zawierać wiele różnych DataTable
s i zapewniają pełne wsparcie dla nieodłącznych relacji między tabelami, umożliwiając utworzenie między tabelami DataRelation
. Następnie można uzyskać powiązane rekordy dla każdego scenariusza, dzwoniąc pod numer GetChildRows()
lub GetParentRows()
z tabeli Kapitan lub Szczegóły.
Istnieje prawdopodobnie wiele próbek online, które ilustrują, jak to zrobić. Here's one discussion thread z mojej grupy, w której wymienione są kroki i podałem kod w celu zademonstrowania procedury.
Dzięki. Teraz skończyłem to, co zacząłem :) –
Dobra odpowiedź, ale myślę, że pozostawiasz część pytania bez odpowiedzi. ;-) – Cerebrus