Holen datarow -, c# - Objekt
Ich habe eine Klasse Element repräsentiert ein Element in einer Liste. Ich habe in der it-Funktion aufruft gespeicherte Prozedur zurückgibt, datatable und ich brauche, um zu konvertieren, die die datatable an Array von Elementen.
Hier ist was ich tun:
public class Item
{
private string _ItemIdDataName = "item_id";
private string _ItemNameDataName = "item_name";
private string _PriceDataName = "price";
public long ItemId { get; set; }
public string ItemName { get; set; }
public float Price { get; set; }
private Item(DataRow row)
{
if (row != null)
{
ItemId = long.Parse(row[_ItemIdDataName].ToString());
ItemName = row[_ItemNameDataName].ToString();
Price = float.Parse(row[_PriceDataName].ToString());
}
}
public Item[] load()
{
DataTable dt=DBHandler.GetItems();//Stored procedure that returns DataTable
Item[] items = new Item[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
items[i] = new Item(dt.Rows[i]);
}
return items;
}
}
Mache ich es richtig?
Wie kann ich diese verbessern?
Warum ist
Da sieht es sehr meanningless, um es unter verschiedenen Klasse. Ich habe viele Fälle wie dieser und ich kann nicht haben hundert Klassen, die nur gibt query-Ergebnis.
machen Sie statische zumindest..
load()
im inneren Element der Klasse?Da sieht es sehr meanningless, um es unter verschiedenen Klasse. Ich habe viele Fälle wie dieser und ich kann nicht haben hundert Klassen, die nur gibt query-Ergebnis.
machen Sie statische zumindest..
InformationsquelleAutor Naor | 2011-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur gonna verwenden Sie es, sobald es wahrscheinlich in Ordnung, aber wenn Sie es tun werden, eine Menge, die Sie sollten versuchen zu tun, einige eher Allgemeine Sachen. Ich schrieb einen blog-post über wie schreibt man eine extension-Methode für
DataTable
erstellt eine Liste von Objekten. Es funktioniert, indem es die Konvention, dass die Eigenschaften im Objekt-sollten den selben Namen haben wie die Spalten in der gespeicherten Prozedur (ich würde den Namen ändern, die in der gespeicherten Prozedur, wenn ich könnte):Jetzt können Sie nur aufrufen,
oder
Den blog-post ist hier: http://blog.tomasjansson.com/2010/11/convert-datatable-to-generic-list-extension
Gibt es viele Möglichkeiten, in denen Sie können erweitern Sie diese, Sie könnte irgendeine Art von mapping-Wörterbuch sagen, die Erweiterung, wie die Zuordnung der Spalten, und auf diese Weise die Namen nicht übereinstimmen müssen. Oder Sie können eine Liste von Eigenschaftennamen, die Sie möchten, um auszuschließen, das mapping.
Update: Ihr Objekt (
Item
), die Sie erstellen, muss einen Standard-Konstruktor, sonst wird die private Methode nicht in der Lage sein, um es zu schaffen. Da die Art, wie die Lösung funktioniert ist zuerst erstellen Sie das Objekt über Eigenschaften, die Sie von der Reflexion, um die Werte des Objekts.Update 2: ich habe den Teil mit den Zuordnungen Wörterbuch aber noch nicht selber ausprobiert, daher kann es nicht kompilieren. Aber das Konzept ist da und ich denke, es funktioniert.
Danke... ich war versucht, es einfach halten, und es ist nicht schwer, abgestimmt auf Ihr Objekt Eigenschaften gegen die Spalten der gespeicherten Prozedur :).
Hier können Sie davon ausgehen, dass die db-Felder-Namen sind equale für die Mitglieder-Namen. Was ist nicht immer wahr. Bin ich falsch?
Sie sind 100 % richtig, und ich so in der Antwort. Wenn ich diese umgesetzt habe ich versucht, die Objekt-Eigenschaften ausgerichtet, die mit den Namen der Spalten, um es einfacher zu machen und es funktionierte perfekt in Ordnung. Wenn das nicht der Fall, ändern Sie die extension-Methode auch einen
Dictionary<string, string>
dass Karten die Eigenschaft name in die Spalte name, siehe update in ein paar Minuten.Nette Antwort, aber Vorsicht-Eigenschaften ohne öffentliche setter! Siehe: stackoverflow.com/questions/2811198/...
InformationsquelleAutor Tomas Jansson
Ziemlich gut, aber ich habe ein paar Vorschläge:
Nicht gegossen Dinge ToString zu
analysiert werden zurück zu einer anderen Art. Diese
kann die Ursache für die Korruption Ihrer Daten
geben, und ist langsam/ineffizient.
Erwarten, und überprüfen Sie die null kommt von SQL Server.
Statt:
Versuchen:
(Fügen Sie einen Verweis auf System.Daten.DatasetExtensions, um die Feld-Erweiterung)
InformationsquelleAutor
Perfekte job für AutoMapper.
Zwei Beispiele:
http://house9.blogspot.com/2010/11/automapper-datatable-to-list.html
http://www.geekytidbits.com/automapper-with-datatables/
In der Tat - aber das war gefragt, sowie nach der AutoMapper existierte, und dies kommt noch in der google-Suche nach einer Antwort zu suchen. StackOverflow ist für das finden der besten Antworten, die nicht für die Sicherstellung der Unterhaltung, bindet gut und ist dann geschlossen - wenn es das ist, was Sie wollen, verwenden Sie Google Groups.
diese Antwort markiert werden muss, als "Antwort"
InformationsquelleAutor Chris Moschini
Ihre privaten Element-Konstruktor und der
load()
Funktionen scheinen nicht zu gehören in IhremItem
Klasse.Wissen Sie, eine Klasse sollte eine Sache zu tun und eine Sache gut.
So versuchen
1. gestalten Sie sich die privaten c ' Tor zu einem sagen, dass eine Helfer-Klasse, die einfach analysiert die DataRow und gibt eine Instanz des Elements
2. und überarbeiten Sie den
load()
in eine andere Klasse, nutzt einfach den oben genannten Helfer-Methode und gibt ein array von Item-Objekt-InstanzenIch bin nur der Beantwortung Ihrer wichtigsten Fragen 😉
InformationsquelleAutor Sung M. Kim