Ich habe eine DataTable
, die von einer SQL-Abfrage in eine lokale Datenbank ausgefüllt wird, aber ich weiß nicht, wie ich Daten daraus extrahieren soll. Hauptmethode (im Testprogramm):
static void Main(string[] args)
{
const string connectionString = "server=localhost\\SQLExpress;database=master;integrated Security=SSPI;";
DataTable table = new DataTable("allPrograms");
using (var conn = new SqlConnection(connectionString))
{
Console.WriteLine("connection created successfuly");
string command = "SELECT * FROM Programs";
using (var cmd = new SqlCommand(command, conn))
{
Console.WriteLine("command created successfuly");
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
conn.Open();
Console.WriteLine("connection opened successfuly");
adapt.Fill(table);
conn.Close();
Console.WriteLine("connection closed successfuly");
}
}
Console.Read();
}
Der Befehl, mit dem ich die Tabellen in meiner Datenbank erstellt habe:
create table programs
(
progid int primary key identity(1,1),
name nvarchar(255),
description nvarchar(500),
iconFile nvarchar(255),
installScript nvarchar(255)
)
Wie kann ich Daten aus dem DataTable
in ein sinnvoll zu verwendendes Formular extrahieren ?
foreach
funktioniert, weilRows
es sich um eine Sammlung handelt (DataRowCollection
). Sie müssen jedoch verwenden,.Cast<DataRow>()
wenn Sie einige Linq-Methoden verwenden möchten (.Where()
zum Beispiel).Sie können die Datentabelle als Datenquelle für viele Elemente festlegen.
Zum Beispiel
Rasteransicht
Verstärker
Datalist
etc etc.
Wenn Sie Daten aus jeder Zeile extrahieren müssen, können Sie verwenden
table.rows[rowindex][columnindex]
oder
wenn Sie den Spaltennamen kennen
table.rows[rowindex][columnname]
Wenn Sie die Tabelle iterieren müssen, können Sie entweder eine for-Schleife oder eine foreach-Schleife wie verwenden
for ( int i = 0; i < table.rows.length; i ++ ) { string name = table.rows[i]["columnname"].ToString(); } foreach ( DataRow dr in table.Rows ) { string name = dr["columnname"].ToString(); }
quelle
Der einfachste Weg, Daten aus einem zu extrahieren,
DataTable
wenn Sie mehrere Datentypen (nicht nur Zeichenfolgen) haben, ist die Verwendung derField<T>
in derSystem.Data.DataSetExtensions
Assembly verfügbaren Erweiterungsmethode .var id = row.Field<int>("ID"); // extract and parse int var name = row.Field<string>("Name"); // extract string
Von MSDN ist die
Field<T>
Methode:Dies bedeutet, dass bei Angabe des Typs das Objekt überprüft und entpackt wird.
Zum Beispiel:
// iterate over the rows of the datatable foreach (var row in table.AsEnumerable()) // AsEnumerable() returns IEnumerable<DataRow> { var id = row.Field<int>("ID"); // int var name = row.Field<string>("Name"); // string var orderValue = row.Field<decimal>("OrderValue"); // decimal var interestRate = row.Field<double>("InterestRate"); // double var isActive = row.Field<bool>("Active"); // bool var orderDate = row.Field<DateTime>("OrderDate"); // DateTime }
Es werden auch nullfähige Typen unterstützt:
DateTime? date = row.Field<DateTime?>("DateColumn");
Dies kann das Extrahieren von Daten vereinfachen,
DataTable
da das Objekt nicht mehr explizit in die richtigen Typen konvertiert oder analysiert werden muss.quelle
Bitte erwägen Sie die Verwendung eines solchen Codes:
SqlDataReader reader = command.ExecuteReader(); int numRows = 0; DataTable dt = new DataTable(); dt.Load(reader); numRows = dt.Rows.Count; string attended_type = ""; for (int index = 0; index < numRows; index++) { attended_type = dt.Rows[indice2]["columnname"].ToString(); } reader.Close();
quelle
Sofern Sie keinen bestimmten Grund haben, raw ado.net zu verwenden, würde ich einen ORM (Object Relational Mapper) wie nHibernate oder LINQ to SQL verwenden. Auf diese Weise können Sie die Datenbank abfragen und Objekte zum Arbeiten abrufen, die stark typisiert sind und mit IMHO einfacher zu arbeiten sind.
quelle
var table = Tables[0]; //get first table from Dataset foreach (DataRow row in table.Rows) { foreach (var item in row.ItemArray) { console.Write("Value:"+item); } }
quelle
Bitte beachten Sie, dass das Öffnen und Schließen der Verbindung bei Verwendung von DataAdapter nicht erforderlich ist.
Daher schlage ich vor, diesen Code zu aktualisieren und das Öffnen und Schließen der Verbindung zu entfernen:
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
Console.WriteLine("connection opened successfuly"); adapt.Fill(table);
Console.WriteLine("connection closed successfuly");
Referenzdokumentation
quelle