Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: novalida en 25 Marzo 2010, 21:36 pm



Título: Consultar 2 tablas en 1 DataSet [SOLUCIONADO]
Publicado por: novalida en 25 Marzo 2010, 21:36 pm
Hola!!!
Llevo un par de días dando vueltas a este problema y no doy con la solución. A ver si alguien me puede orientar un poquito :)
Desde un formulario quiero realizar una consulta de los libros prestados de una biblioteca.
Las tablas Libros y Prestamos están en un archivo Access y sus columnas son:

Libros
Id_libro / Título / Autor

Prestamos

Nif_socio (de la tabla Socios) / Id_libro

Parte de mi código para la definición de conexión y consulta:
Código:
    Private oConexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data source=C:\Biblioteca.mdb")
    Private oDataAdapter As OleDbDataAdapter
    Private oCommandBuilder As OleDbCommandBuilder
    Private oDataSet As DataSet
    Private SQL As String

Código:
Private Sub ConsultaBasePrestamos()
        Me.SQL = "select * from Libros, Prestamos"
        Me.oDataAdapter = New OleDbDataAdapter(Me.SQL, Me.oConexion)
        Me.oCommandBuilder = New OleDbCommandBuilder(Me.oDataAdapter)
        Me.oDataSet = New DataSet

        Me.oConexion.Open()
        Me.oDataAdapter.Fill(Me.oDataSet, "Prestamos")
        Me.oDataAdapter.Fill(Me.oDataSet, "Libros")
        Me.oConexion.Close()

        Dim oDataRow0 As DataRow ' Variable para trabajar con las filas de Prestamos
        Dim oDataRow1 As DataRow 'Variable apra trabajar con las filas de Libros
        Dim oDataTable As DataTable ? 'Tabla para almacenar la consulta

        ' Procedimiento para obtener los libros prestados
        For i As Integer = 0 To Me.oDataSet.Tables(0).Rows.Count - 1
            oDataRow0 = Me.oDataSet.Tables(0).Rows(i)
            For j As Integer = 0 To Me.oDataSet.Tables(1).Rows.Count - 1
                oDataRow1 = Me.oDataSet.Tables(1).Rows(j)
                If oDataRow0("Id_libro") = oDataRow1("Id_libro") Then
                    oDataTable = (oDataRow1.Table)
                End If
            Next
        Next
    End Sub

Al ejecutar me da el siguiente error: "La columna 'Id_libro' no pertenece a la tabla Prestamos."
La columna existe en la tabla, pero no sé por qué me da este error.
Alguien me puede ayudar?

Gracias :)


Título: Re: Consultar 2 tablas en 1 DataSet
Publicado por: CeLaYa en 26 Marzo 2010, 18:12 pm
que tal buenos días


tu problema esta en la consulta sql "select * from Libros, Prestamos"
lo que pasa es que debes poner que campos tomara de cada tabla, ponla así:

SELECT L.Id_libro, L.Título, L.Autor, P.Nif_socio
FROM Libros L, Prestamos P
WHERE L.id_libro = P.id_Libro


con esto tendras una lista de los libros prestados y ya no es necesario los for anidados
--------------------------------------------------------------------
   ' Procedimiento para obtener los libros prestados
        For i As Integer = 0 To Me.oDataSet.Tables(0).Rows.Count - 1
            oDataRow0 = Me.oDataSet.Tables(0).Rows(i)
            For j As Integer = 0 To Me.oDataSet.Tables(1).Rows.Count - 1
                oDataRow1 = Me.oDataSet.Tables(1).Rows(j)
                If oDataRow0("Id_libro") = oDataRow1("Id_libro") Then
                    oDataTable = (oDataRow1.Table)
                End If
            Next
        Next
-------------------------------------------------------------------------------------------


Título: Re: Consultar 2 tablas en 1 DataSet
Publicado por: novalida en 28 Marzo 2010, 13:12 pm
Hola!!!
Gracias por tu respuesta. Al final el código quedó de esta manera y funciona como yo quería :)

Código:
Me.oDataAdapter = New OleDbDataAdapter("select Libros.Id_libro, Titulo, Autor from libros, prestamos where Libros.Id_libro = Prestamos.Id_libro", Me.oConexion)
        Me.oCommandBuilder = New OleDbCommandBuilder(Me.oDataAdapter)
        Me.oDataSet = New DataSet()


        Me.oConexion.Open()
        Me.oDataAdapter.Fill(Me.oDataSet, "libros")
        Me.oConexion.Close()

        Me.DataGridView1.DataSource = Me.oDataSet.Tables("Libros")

Muchas gracias