web-dev-qa-db-fra.com

Comment extraire des données d'un DataTable?

J'ai une DataTable qui est remplie d'une requête SQL vers une base de données locale, mais je ne sais pas comment en extraire des 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 de la DataTable dans un formulaire à utiliser?

54
RCIX

Le DataTable a 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 valeur unique, 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();
 }

Marc

130
marc_s

Vous pouvez définir le datatable en tant que source de données sur de nombreux éléments.

Par exemple

gridView

répétiteur

datalist

etc

Si vous devez extraire des données de chaque ligne, vous pouvez utiliser

table.rows[rowindex][columnindex]

ou

si vous connaissez le nom de la colonne

table.rows[rowindex][columnname]

Si vous devez itérer la table, vous pouvez utiliser une boucle for ou une boucle foreach comme

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

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

À moins que vous n'ayez une raison spécifique de faire raw ado.net, je jetterais un coup d'œil à l'utilisation d'un ORM (objet relationnel mappeur) comme nhibernate ou Linq to Sql. De cette façon, vous pouvez interroger la base de données et récupérer des objets très typés et plus faciles à utiliser avec IMHO.

Colin G

3
pythonandchips

Une autre option pour extraire des données d'un DataTable consiste à utiliser la méthode d'extension Field<T> disponible dans l'assembly System.Data.DataSetExtensions.

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

De MSDN , la méthode Field<T>:

Fournit un accès fortement typé à chacune des valeurs de colonne du fichier DataRow.

Cela signifie que lorsque vous spécifiez le type, celui-ci sera validé et déballé.

Par exemple:

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

Il supporte également les types nullables:

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

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

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
Hamid Bahmanabady

Veuillez noter qu'ouvrir et fermer la connexion n'est pas nécessaire lors de l'utilisation de DataAdapter.

Je suggère donc de mettre à jour ce code et de supprimer l'ouverture et la fermeture de la connexion:

        SqlDataAdapter adapt = new SqlDataAdapter(cmd);

conn.Open (); // cette ligne de code est non-nécessaire 

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

conn.Close (); // cette ligne de code est non-nécessaire 

        Console.WriteLine("connection closed successfuly");

Documentation de référence

Le code présenté dans cet exemple n'ouvre et ne ferme pas explicitement le fichier Lien. La méthode Fill ouvre implicitement la connexion que le DataAdapter utilise s'il trouve que la connexion n'est pas déjà ouvrir. Si Fill a ouvert la connexion, la connexion est également fermée quand le remplissage est terminé. Cela peut simplifier votre code lorsque vous traitez avec une seule opération telle qu'un remplissage ou une mise à jour. Cependant, si vous êtes effectuer plusieurs opérations nécessitant une connexion ouverte, vous pouvez améliorer les performances de votre application en appelant explicitement la méthode Open de la connexion, en effectuant les opérations sur la source de données, puis en appelant la méthode Close de la connexion . Vous devez essayer de garder les connexions à la source de données ouvertes aussi brièvement que possible possible de libérer des ressources pour les utiliser avec d’autres applications clientes.

0
Rick