Ich habe eine DataTable
, die von einer SQL-Abfrage in eine lokale Datenbank eingefügt 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, den ich zum Erstellen der Tabellen in meiner Datenbank verwendet 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 der DataTable
in ein Formular extrahieren, das für die Verwendung sinnvoll ist?
Die DataTable enthält eine Sammlung .Rows
von DataRow-Elementen.
Jede DataRow entspricht einer Zeile in Ihrer Datenbank und enthält eine Auflistung von Spalten.
Um auf einen einzelnen Wert zuzugreifen, gehen Sie folgendermaßen vor:
foreach(DataRow row in YourDataTable.Rows)
{
string name = row["name"].ToString();
string description = row["description"].ToString();
string icoFileName = row["iconFile"].ToString();
string installScript = row["installScript"].ToString();
}
Marc
Sie können die Datentabelle als Datenquelle auf viele Elemente festlegen.
Für zB
rasteransicht
repeater
datalist
usw
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 wiederholen müssen, können Sie entweder eine for-Schleife oder eine foreach-Schleife 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();
}
Bitte überlegen Sie sich einen Code wie diesen:
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();
Wenn Sie keinen bestimmten Grund haben, rohe ado.net zu machen, würde ich einen ORM (Object Relational Mapper) wie nhibernate oder Linq to Sql verwenden. Auf diese Weise können Sie die Datenbank und die Objekte abfragen, mit denen gearbeitet werden soll.
Colin G
Eine weitere Option zum Extrahieren von Daten aus einer DataTable
ist die Verwendung der Erweiterungsmethode Field<T>
in der System.Data.DataSetExtensions
-Assembly.
var id = row.Field<int>("ID"); // extract and parse int
var name = row.Field<string>("Name"); // extract string
Von MSDN die Field<T>
-Methode:
Bietet einen stark typisierten Zugriff auf jeden der Spaltenwerte in der DataRow.
Das heißt, wenn Sie den Typ angeben, wird das Objekt überprüft und das Postfach aufgehoben.
Zum Beispiel:
// iterate over the rows of the datatable
foreach (DataRow row in table.Rows)
{
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 unterstützt auch nullfähige Typen:
DateTime? date = row.Field<DateTime?>("DateColumn");
Dies kann das Extrahieren von Daten aus DataTable
vereinfachen, da das Objekt nicht explizit in die richtigen Typen konvertiert oder analysiert werden muss.
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);
}
}
Bitte beachten Sie, dass das Öffnen und Schließen der Verbindung bei der Verwendung von DataAdapter nicht erforderlich ist.
Ich empfehle daher, diesen Code zu aktualisieren und das Öffnen und Schließen der Verbindung zu entfernen:
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
conn.Open (); // Diese Codezeile ist unnötig
Console.WriteLine("connection opened successfuly");
adapt.Fill(table);
conn.Close (); // Diese Codezeile ist unnötig
Console.WriteLine("connection closed successfuly");
Der in diesem Beispiel gezeigte Code öffnet und schließt nicht explizit die Verbindung. Die Fill-Methode öffnet implizit die Verbindung mit der DataAdapter verwendet, wenn festgestellt wird, dass die Verbindung nicht bereits vorhanden ist öffnen. Wenn Fill die Verbindung geöffnet hat, wird auch die Verbindung geschlossen wenn Fill fertig ist. Dies kann Ihren Code vereinfachen, wenn Sie mit .__ arbeiten. ein einzelner Vorgang wie Füllen oder Aktualisieren. Wenn Sie jedoch .__ sind. Durchführen mehrerer Vorgänge, für die eine offene Verbindung erforderlich ist, müssen Sie kann die Leistung Ihrer Anwendung verbessern, indem Sie explizit aufrufen. die Open-Methode der Verbindung und führt die Vorgänge gegen .__ aus. die Datenquelle und ruft dann die Close-Methode der Verbindung auf. Sie sollten versuchen, die Verbindungen zur Datenquelle so kurz geöffnet zu lassen Ressourcen zur Verwendung durch andere Clientanwendungen freigeben.