2009-08-28 17 views
47

Ich habe eine DataTable, die aus einer SQL-Abfrage in eine lokale Datenbank ausgefüllt wird, aber ich weiß nicht, wie Sie Daten daraus extrahieren. Main-Methode (Testprogramm):Wie extrahiere ich Daten aus einer DataTable?

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 die Tabellen in der Datenbank zu erstellen:

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 extrahieren Daten aus dem DataTable in eine Form sinnvoll zu nutzen?

Antwort

115

Die Datatable hat verwenden eine Sammlung .Rows von DataRow-Elementen.

Jede DataRow entspricht einer Zeile in Ihrer Datenbank und enthält eine Sammlung von Spalten.

Um einen einzelnen Wert zuzugreifen, tun Sie etwas wie folgt aus:

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

+2

Ich weiß, das ist eine alte Antwort, aber nicht Sie brauchen eine Besetzung in der foreach-Schleife zu tun Indizierung zu ermöglichen? Ich war nicht in der Lage, so etwas zu tun, bis ich den Code geändert wie folgt aussehen: foreach (DataRow Reihe in YourDataTable.Rows.Cast ()) ... – awh112

+0

Auch älterer Kommentar, aber es gibt keine Notwendigkeit um zu wirken: 'foreach' funktioniert, weil' Rows' eine Sammlung ist ('DataRowCollection'). Allerdings müssen Sie '.Cast ()' verwenden, wenn Sie einige Linq-Methoden ('.Where()', für ein Beispiel) verwenden möchten. –

+1

@marc_s Danke –

16

Sie können die Datentabelle als Datenquelle für viele Elemente festlegen.

Für zB

gridview

Repeater

Datalist

etc etc

Wenn Sie Daten aus jeder Zeile extrahieren müssen, dann können Sie

table.rows[rowindex][columnindex] 
verwenden

oder

, wenn Sie die Spaltennamen

table.rows[rowindex][columnname] 

wissen Wenn Sie die Tabelle zu durchlaufen müssen, dann können Sie entweder eine for-Schleife oder eine foreach-Schleife wie

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(); 
} 
+0

foreach (DataRow dr in Tabelle) table.Rows – StampedeXV

3

Sofern Sie keinen besonderen Grund haben rohe ado.net zu tun würde ich einen Blick ein ORM bei Verwendung (Objektrelationaler Mapper) wie Nhibernate oder Linq zu Sql. Auf diese Weise können Sie die Datenbank abfragen und Objekte abrufen, mit denen stark typisiert und einfacher mit IMHO gearbeitet werden soll.

Colin G

+1

Ich bekomme ein Grundwissen über ADO.net, bevor ich zu einem ORM übergehe, wie es von http://stackoverflow.com/questions/1345508/how-do-i-connect-to-a- vorgeschlagen wird. SQL-Datenbank-von-c/1345531 # 1345531 – RCIX

4

Bitte beachten Sie einige Code wie folgt aus:

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(); 
0
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); 
     } 
    } 
0

Bitte beachten Sie, dass Öffnen und Schließen der Verbindung nicht erforderlich ist, wenn Dataadapter verwenden.

Deshalb schlage ich bitte diesen Code aktualisieren und das Öffnen und Schließen der Verbindung entfernen:

 SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

conn.Open(); // Diese Codezeile ist uncessessary

 Console.WriteLine("connection opened successfuly"); 
     adapt.Fill(table); 

conn.Close(); // diese Zeile Code ist uncessessary

 Console.WriteLine("connection closed successfuly"); 

Reference Documentation

Der Code in diesem Beispiel entspricht nicht explizit öffnen und schließen Sie die Verbindung. Die Fill-Methode öffnet implizit die Verbindung, die der DataAdapter verwendet, wenn er feststellt, dass die Verbindung nicht bereits geöffnet ist. Wenn Fill die Verbindung geöffnet hat, schließt es auch die Verbindung , wenn Fill beendet ist. Dies kann Ihren Code vereinfachen, wenn Sie mit einen einzelnen Vorgang wie Fill oder Update bearbeiten. Wenn Sie jedoch mehrere Operationen durchführen, die eine offene Verbindung erfordern, können Sie die Leistung Ihrer Anwendung verbessern, indem Sie die Open-Methode der Verbindung explizit aufrufen , die Vorgänge gegen die Datenquelle ausführen und dann die Close-Methode aufrufen der Verbindung. Sie sollten versuchen, die Verbindungen zur Datenquelle so kurz wie möglich offen zu halten, um Ressourcen für die Verwendung durch andere Client-Anwendungen freizugeben.

Verwandte Themen