Ik ben bezig met een naslag programma te maken met een Acces database als opslag. Nu heb ik in een tabel een column met als type Time. Dit gebruik ik om de speeltijd van een liedje in op te slaan dus in HH:MM:SS formaat (In Acces staat het aangegeven met Data/Time)
Nu als ik een select uitvoer op deze database en wil laten zien in een datagridview in c# heb ik een probleem met de tijd column. Hij geeft 30-12-1899 0:00 aan ipv 00:00:56.
De query die uitwordt gevoerd is "select * from Music".
Via google kom ik manieren tegen waar je een lege datatable hebt die vult met kolomen vanuit de database. Dan verander je de tijd column naar een Timespan met :
musicTable.Columns[4].DataType = System.Type.GetType("System.TimeSpan");
En dan 1 voor 1 de rijen importen maar dit werkt niet. Dit komt omdat in de rij de tijd waarde niet een timespan is waardoor hij op z'n gat gaat:
dit werkt dus niet:
Het vreemste vind ik zelf dat in C# niet automatisch wordt gedetecteerd dat het een TimeSpan veld is. Hoe kan ik dit probleem verhelpen?
Nu als ik een select uitvoer op deze database en wil laten zien in een datagridview in c# heb ik een probleem met de tijd column. Hij geeft 30-12-1899 0:00 aan ipv 00:00:56.
De query die uitwordt gevoerd is "select * from Music".
Via google kom ik manieren tegen waar je een lege datatable hebt die vult met kolomen vanuit de database. Dan verander je de tijd column naar een Timespan met :
musicTable.Columns[4].DataType = System.Type.GetType("System.TimeSpan");
En dan 1 voor 1 de rijen importen maar dit werkt niet. Dit komt omdat in de rij de tijd waarde niet een timespan is waardoor hij op z'n gat gaat:
De tijd wordt in de database opslagen door middel van de ToString() van een Timespan.Specified cast is not valid.Couldn't store <30-12-1899 0:00:56> in duration Column. Expected type is TimeSpan.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| public DataTable getMusic() { //create the connection string string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + databaseFile+ ";Jet OLEDB:Engine Type=5"; //create the database query string query = "SELECT * FROM Music"; //create an OleDbDataAdapter to execute the query OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString); //create a command builder OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter); //create a DataTable to hold the query results DataTable dTable = new DataTable(); //fill the DataTable dAdapter.Fill(dTable); //return the table return dTable; } |
dit werkt dus niet:
C#:
1
2
3
4
5
6
7
| DataTable rawMusicTable = manager.getMusic(); DataTable musicTable = rawMusicTable.Clone(); musicTable.Columns[4].DataType = System.Type.GetType("System.TimeSpan"); for (int i = 0; i < rawMusicTable.Rows.Count; i++ ) { musicTable.ImportRow(rawMusicTable.Rows[i]); } |
Het vreemste vind ik zelf dat in C# niet automatisch wordt gedetecteerd dat het een TimeSpan veld is. Hoe kan ik dit probleem verhelpen?
[This space is for rent]