90 votes

Comment extraire des données d'un tableau de données ?

Tengo un DataTable qui est remplie à partir d'une requête SQL dans une base de données locale, mais je ne sais pas comment en extraire les données. Méthode principale (dans le programme de test) :

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

La commande que j'ai utilisée pour créer les tables dans ma base de données :

create table programs
(
    progid int primary key identity(1,1),
    name nvarchar(255),
    description nvarchar(500),
    iconFile nvarchar(255),
    installScript nvarchar(255)
)

Comment puis-je extraire des données du DataTable sous une forme utilisable ?

177voto

marc_s Points 321990

Le tableau de données possède une collection .Rows d'éléments DataRow.

Chaque DataRow correspond à une ligne de votre base de données et contient une collection de colonnes.

Pour accéder à une seule valeur, procédez comme suit :

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

2 votes

Je sais qu'il s'agit d'une vieille réponse, mais ne faut-il pas faire un cast dans la boucle foreach pour permettre l'indexation ? Je n'étais pas en mesure de faire quelque chose comme cela jusqu'à ce que je modifie le code pour qu'il ressemble à ce qui suit : foreach(DataRow row in YourDataTable.Rows.Cast<DataRow>()) ...

1 votes

Un commentaire encore plus ancien, mais il n'est pas nécessaire de faire un casting : foreach fonctionne, car Rows est une collection ( DataRowCollection ). Cependant, vous devez utiliser .Cast<DataRow>() si vous souhaitez utiliser certaines méthodes Linq ( .Where() à titre d'exemple).

27voto

rahul Points 84185

Vous pouvez définir la table de données comme source de données pour de nombreux éléments.

Par exemple

gridView

répétiteur

liste de données

etc etc

Si vous avez besoin d'extraire des données de chaque ligne, vous pouvez utiliser

table.rows[rowindex][columnindex]

o

si vous connaissez le nom de la colonne

table.rows[rowindex][columnname]

Si vous devez itérer le tableau, vous pouvez utiliser une boucle for ou une boucle foreach comme suit

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 votes

Foreach ( DataRow dr in table ) table.Rows

12voto

haldo Points 4255

La manière la plus simple d'extraire des données d'un DataTable lorsque vous avez plusieurs types de données (pas seulement des chaînes de caractères) est d'utiliser la fonction Field<T> disponible dans la méthode d'extension System.Data.DataSetExtensions l'assemblée.

var id = row.Field<int>("ID");         // extract and parse int
var name = row.Field<string>("Name");  // extract string

En MSDN El Field<T> méthode :

Fournit un accès fortement typé à chacune des valeurs des colonnes de la base de données DataRow.

Cela signifie que lorsque vous spécifiez le type, l'objet est validé et décoché.

Par exemple :

// 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
}

Il prend également en charge les types nullables :

DateTime? date = row.Field<DateTime?>("DateColumn");

Cela peut simplifier l'extraction de données à partir de DataTable car il n'est pas nécessaire de convertir ou d'analyser explicitement l'objet dans les types appropriés.

5voto

MacAhmed Points 26

Veuillez envisager d'utiliser un code comme celui-ci :

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

3voto

Colin G Points 797

A moins que vous n'ayez une raison spécifique de faire du raw ado.net, j'envisagerais d'utiliser un ORM (object relational mapper) comme nHibernate ou LINQ to SQL. De cette façon, vous pouvez interroger la base de données et récupérer des objets avec lesquels travailler, qui sont fortement typés et plus faciles à utiliser.

1 votes

Je cherche à acquérir une connaissance de base d'ADO.net avant de passer à un ORM comme suggéré par stackoverflow.com/questions/1345508/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X