none
Cargar formato numero personalizado en DataTable RRS feed

  • Pregunta

  • Hola,

    Estoy trabajando con vb.net 2008 y tengo un problema con una conexión OledB. La conexión es la siguiente:

    Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (Path & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=0"";")))

    Dim cnConex As New OleDbConnection(stConexion)

    Dim Cmd As New OleDbCommand("Select * from [" & SheetNameSelected & "$]")

    Dim Da As New OleDbDataAdapter

    Dim AuxTable As New DataTable

     

    SheetDataTable = New DataTable(SheetNameSelected)

    cnConex.Open()

    Cmd.Connection = cnConex

    Da.SelectCommand = Cmd

    Da.FillSchema(AuxTable, SchemaType.Source)

     

    El problema viene de que algunas de las columnas del excel tienen datos de hora con un formato de número personalizado, concretamente "hh:mm:ss,000". Al hacer la conexión, una celda con el contenido "22:48:32,503", por ejemplo, la carga en el datatable como "22:48:33.497" y otra con el contenido "22:48:32,823" la carga como "22:48:33.177". No encuetro ninguna lógica a la conversión de datos que hace porque, como podeis ver, ni siquiera el dato mayor en excel es el mayor en el datatable.

    No controlo los excel de entrada así que el formato de número ha de ser el indicado.

    He estado probando con diferentes configuraciones regionales y cambiando separador decimal de excel sin llegar a nada útil.

    ¿Sabe alguien si se le puede dar un formato determinado a la celda del datatable que va a contener ese tipo de datos?. ¿Alguna otra sujerencia?

    Muchas gracias por adelantado.

    lunes, 13 de diciembre de 2010 11:17

Todas las respuestas

  • hola

    la uncia forma que se me ocurre podrias solucionar el problema es usando un dataset tipado para cargar los datos

    o sea en luegar de definir solo el datatable en la linea

    Dim AuxTable As New DataTable

    agregarla este tambien los campos que se deberan cargar, entocnes si a estos puedes especificarle los tipos de datos

    por supuesto los nombre de los campos deberan coincidir con los recuperados en la query

    como veras en el link los nombres de las columans pueden ser definidos

    Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 14 de diciembre de 2010 3:09
  • Gracias Leandro pero no consigo entender de todo tu respuesta. Es la primera vez que trabajo con Bases de Datos en .Net y no estóy en absoluto familiarizado con C. El código completo que en realidad tengo es: Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (PathESSM & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=0"";"))) Dim stConexionAux As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (PathESSM & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"))) Dim cnConex As New OleDbConnection(stConexion) Dim cnConexAux As New OleDbConnection(stConexionAux) Dim Cmd As New OleDbCommand("Select * from [" & SheetNameSelected & "$]") Dim Da As New OleDbDataAdapter Dim DaAux As New OleDbDataAdapter Dim AuxTable As New DataTable SheetDataTable = New DataTable(SheetNameSelected) cnConexAux.Open() Cmd.Connection = cnConexAux DaAux.SelectCommand = Cmd DaAux.Fill(SheetDataTable) cnConex.Open() Cmd.Connection = cnConex Da.SelectCommand = Cmd Da.FillSchema(AuxTable, SchemaType.Source) SheetDataTable.Rows(0).Delete() For i As Integer = 0 To SheetDataTable.Columns.Count - 1 SheetDataTable.Columns(i).ColumnName = AuxTable.Columns(i).ColumnName Next De este modo cojo por un lado cojo las cabeceras y por el otro los datos. Así asigno los nombres a las columnas. Lo que me dices es que agregue los campos que se van a cargar pero no se como hacerlo. Y lo segundo que especifique el tipo de datos de estos campos y tampoco se como hacerlo si el tipo es personalizado. Agradecería cualquier ejemplo para poder llevar a cabo lo que me indicas. De nuevo muchas gracias.
    martes, 14 de diciembre de 2010 9:21
  • Perdón por el desastre de mensage anterior.

    Gracias Leandro pero no consigo entender de todo tu respuesta. Es la primera vez que trabajo con Bases de Datos en .Net y no estoy en absoluto familiarizado con C. El código completo que en realidad tengo es:

    Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (PathESSM & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=0"";")))

    Dim stConexionAux As String = ("Provider=Microsoft.ACE.OLEDB.12.0;" & ("Data Source=" & (PathESSM & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";")))

    Dim cnConex As New OleDbConnection(stConexion)

    Dim cnConexAux As New OleDbConnection(stConexionAux)

    Dim Cmd As New OleDbCommand("Select * from [" & SheetNameSelected & "$]")

    Dim Da As New OleDbDataAdapter

    Dim DaAux As New OleDbDataAdapter

    Dim AuxTable As New DataTable

     

    SheetDataTable = New DataTable(SheetNameSelected)

    cnConexAux.Open()

    Cmd.Connection = cnConexAux

    DaAux.SelectCommand = Cmd

    DaAux.Fill(SheetDataTable)

    cnConex.Open()

    Cmd.Connection = cnConex

    Da.SelectCommand = Cmd

    Da.FillSchema(AuxTable, SchemaType.Source)

    SheetDataTable.Rows(0).Delete()

    For i As Integer = 0 To SheetDataTable.Columns.Count - 1

    SheetDataTable.Columns(i).ColumnName = _ AuxTable.Columns(i).ColumnName

    Next

    De este modo cojo por un lado cojo las cabeceras y por el otro los datos. Así asigno los nombres a las columnas. Lo que me dices es que agregue los campos que se van a cargar pero no se como hacerlo. Y lo segundo que especifique el tipo de datos de estos campos y tampoco se como hacerlo si el tipo es personalizado. Agradecería cualquier ejemplo para poder llevar a cabo lo que me indicas. De nuevo muchas gracias.

    martes, 14 de diciembre de 2010 10:07