Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: 1mpuls0 en 21 Marzo 2014, 20:32 pm



Título: VB .Net y Access, Ordenar columnas de tabla.
Publicado por: 1mpuls0 en 21 Marzo 2014, 20:32 pm
Hola.
He estado pidiendo ayuda más de lo normal xD

Bueno tengo el siguiente problema.

Necesito obtener los nombres de los campos de unas tablas que tengo en un archivo de access (mdb).
El problema no es obtener los campos, sino que el resultado lo ordena de manera alfabética y los requiero como se encuentra en la tabla.

Estuve leyendo pero no logro conseguirlo.

Por ejemplo de esta tabla en access
Código
  1. CREATE TABLE Users
  2. (
  3.    [ID] AUTOINCREMENT,
  4.    [Name] TEXT(50),
  5.    [LastName] TEXT(50),
  6.    [DateCreate] DATETIME
  7. );
  8.  

El resultado obtenido es DataCreate, ID, LastName, Name y lo necesito en el orden en como se encuentra en la tabla (ID, Name, LastName, DateCreate)

Intenté de esta forma. (un ejemplo pequeño)

*Supongamos que mi archivo se llama "Users.mdb" y además se encuentra en el directorio del proyecto por ejemplo "C:\Users\1mpuls0\Documents\Visual Studio 2010\Projects\ApplicationUsers\ApplicationUsers\bin\Debug\Users.mdb"


Código
  1. Imports System.Data.OleDb
  2.  
  3. Public Class Users
  4.  
  5.    Dim fileName As String = "Users.mdb"
  6.    Dim stringConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & fileName
  7.  
  8.    Private Sub Users_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.        Dim connectionFields As New System.Data.OleDb.OleDbConnection(stringConnection)
  10.        connectionFields.Open()
  11.        Dim dataTable As DataTable = connectionFields.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, "Users", Nothing})
  12.        dataTable.DefaultView.Sort = "ORDINAL_POSITION"
  13.  
  14.        Dim columns(dataTable.Rows.Count - 1) As String
  15.  
  16.        For fieldNumber As Integer = 0 To dataTable.Rows.Count - 1
  17.            columns(fieldNumber) = dataTable.Rows(fieldNumber)(3)
  18.            MessageBox.Show(columns(fieldNumber))
  19.        Next
  20.    End Sub
  21. End Class
  22.  

También lo he intentado de esta forma. Pero obtengo el mismo resultado :'/

Código
  1. Imports System.Data.OleDb
  2.  
  3. Public Class Users
  4.  
  5.    Dim fileName As String = "Users.mdb"
  6.    Dim stringConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & fileName
  7.  
  8.    Private Sub Users_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.        Dim connectionFields As New System.Data.OleDb.OleDbConnection(stringConnection)
  10.        Dim str2$(0)
  11.        connectionFields.Open()
  12.        Dim dataTable As DataTable = connectionFields.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, "Users", Nothing})
  13.  
  14.        Dim columns(dataTable.Rows.Count - 1) As String
  15.  
  16.        For fieldNumber As Integer = 0 To dataTable.Rows.Count - 1
  17.            ReDim Preserve str2(fieldNumber)
  18.            str2(fieldNumber) = dataTable.Rows(fieldNumber)!COLUMN_NAME.ToString
  19.            MessageBox.Show(str2(fieldNumber))
  20.        Next
  21.    End Sub
  22. End Class
  23.  

Alguien sabe como puedo hacerlo?.


Solución:

Código
  1. Imports System.Data.OleDb
  2.  
  3. Public Class Users
  4.  
  5.    Dim fileName As String = "Users.mdb"
  6.    Dim stringConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & fileName
  7.  
  8.    Private Sub Users_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.        Dim connectionFields As New System.Data.OleDb.OleDbConnection(stringConnection)
  10.        connectionFields.Open()
  11.        Dim dataTable As DataTable = connectionFields.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, "Users", Nothing})
  12.  
  13.        Dim DataRowArray() As DataRow = dataTable.Select(Nothing, "ORDINAL_POSITION", DataViewRowState.CurrentRows)
  14.  
  15.        For Each dr As DataRow In DataRowArray
  16.            MsgBox(dr.Item("COLUMN_NAME"))
  17.        Next
  18.    End Sub
  19. End Class
  20.  

Llevaba algunos días con este tema. Me costó 2 y la mitad del otro xD

Gracias