web-dev-qa-db-fra.com

Lecture de DataSet

Comment lire les données d'un DataSet dans WPF? J'ai un tableau d'horaire de train avec seulement 2 colonnes et je veux pouvoir lire les heures de départ et calculer l'heure du prochain train. Par exemple, le temps est maintenant 12h29 et mon application devrait me dire que le prochain train partira à 12h33.

J'ai déjà googlé à gauche et à droite. Je suis sur .NET 3.5.

42
Matt

DataSet ressemble à la base de données. DataTable ressemble à la table de base de données et DataRow ressemble à un enregistrement dans une table. Si vous souhaitez ajouter des options de filtrage ou de tri, vous devez le faire avec un objet DataView et le reconvertir en un objet DataTable distinct.

Si vous utilisez une base de données pour stocker vos données, vous devez d'abord charger une table de base de données dans un objet DataSet en mémoire. Vous pouvez charger plusieurs tables de base de données dans un DataSet et sélectionner une table à lire à partir de l'objet DataSet à DataTable. Ensuite, vous lisez une ligne spécifique de données à partir de votre DataTable à DataRow. Les codes suivants montrent les étapes:

SqlCeDataAdapter da = new SqlCeDataAdapter();
DataSet ds = new DataSet();
DataTable dt = new DataTable();

da.SelectCommand = new SqlCommand(@"SELECT * FROM FooTable", connString);
da.Fill(ds, "FooTable");
dt = ds.Tables["FooTable"];

foreach (DataRow dr in dt.Rows)
{
    MessageBox.Show(dr["Column1"].ToString());
}

Pour lire une cellule spécifique dans une rangée:

int rowNum // row number
string columnName = "DepartureTime";  // database table column name
dt.Rows[rowNum][columnName].ToString();
100
KMC

Si ds est le DataSet, vous pouvez accéder à la colonne CustomerID de la première ligne de la première table avec quelque chose comme:

DataRow dr = ds.Tables[0].Rows[0];
Console.WriteLine(dr["CustomerID"]);
20
PeskyGnat

Un DataSet est une copie de données accessible à partir d'une base de données, mais ne nécessite même pas l'utilisation d'une base de données. Il est préférable, cependant.

Notez que si vous créez une nouvelle application, envisagez d'utiliser un ORM, tel que Entity Framework ou NHibernate, car les ensembles de données ne sont plus privilégiés. Cependant, ils sont toujours pris en charge et, autant que je sache, ne s'en vont pas de si tôt.

Si vous lisez à partir d'un jeu de données standard, alors la réponse de @ KMC est ce que vous recherchez. Pour ce faire, il convient toutefois de créer un ensemble de données fortement typé et de l'utiliser afin de pouvoir tirer parti d'Intellisense. En supposant que vous n'utilisez pas Entity Framework, continuez.

Si vous ne disposez pas déjà d'un espace dédié pour votre couche d'accès aux données, tel qu'un projet ou un dossier App_Data, je vous suggère de le créer maintenant. Sinon, procédez comme suit dans le dossier de votre projet de données: Ajouter> Ajouter un nouvel élément> DataSet. Le fichier créé aura une extension .xsd.

Vous devrez ensuite créer un DataTable. Créez un DataTable (cliquez sur le fichier, puis cliquez avec le bouton droit de la souris sur la fenêtre de conception - le fichier a une extension .xsd - et cliquez sur Ajouter> DataTable). Créez des colonnes (Faites un clic droit sur le datatable que vous venez de créer> Ajouter> Colonne). Enfin, vous aurez besoin d'un adaptateur de table pour accéder aux données. Vous devrez configurer une connexion à votre base de données pour accéder aux données référencées dans l'ensemble de données.

Une fois que vous avez terminé, après avoir référencé avec succès le DataSet dans votre projet (à l’aide de statement), vous pouvez accéder au DataSet avec intellisense. Cela le rend tellement plus facile que des ensembles de données non typés.

Dans la mesure du possible, utilisez des ensembles de données fortement typés plutôt que des ensembles non typés. Bien que ce soit plus de travail à créer, cela vous fera gagner beaucoup de temps plus tard avec intellisense. Vous pourriez faire quelque chose comme:

MyStronglyTypedDataSet trainDataSet = new MyStronglyTypedDataSet();
DataAdapterForThisDataSet dataAdapter = new DataAdapterForThisDataSet();
//code to fill the dataset 
//omitted - you'll have to either use the wizard to create data fill/retrieval
//methods or you'll use your own custom classes to fill the dataset.
if(trainDataSet.NextTrainDepartureTime > CurrentTime){
   trainDataSet.QueueNextTrain = true; //assumes QueueNextTrain is in your Strongly-Typed dataset
}
else
    //do some other work

L'exemple ci-dessus suppose que votre ensemble de données fortement typé a une colonne de type DateTime nommée NextTrainDepartureTime. J'espère que ça t'as aidé!

1
cloudstrifebro

S'il s'agit d'une base de données SQL Server, vous pouvez émettre ce type de requête ...

Select Top 1 DepartureTime From TrainSchedule where DepartureTime > 
GetUTCDate()
Order By DepartureTime ASC

GetDate() pourrait également être utilisé, sans savoir comment les dates sont stockées.

Je ne suis pas sûr de savoir comment les données sont stockées et/ou lues.

1
Jon Raynor