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?
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
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();
}
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();
À 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
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.
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);
}
}
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");
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.