wake-up-neo.com

Wie extrahiere ich Daten aus einer DataTable?

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?

54
RCIX

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

130
marc_s

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

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();
4
salimido

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

3
pythonandchips

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.

1
Haldo
  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 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");

Referenzdokumentation

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.

0
Rick