none
Conexion a dos bases de datos distintas RRS feed

  • Pregunta

  • Se puede realizar una conexión y consulta a una base de datos pendiendo de una variable, es decir

    Si la variable dice "Access" haga a consulta en la base de datos access y si la variable dice "SQL_Server" haga la consulta en SQL Server

      Friend Sub Verificar_Prestamos_por_el_Nuemro()
    
    
            Dim DA As OleDbDataAdapter
            Dim DS As DataSet
            Dim lista As Byte
    
            Try
                Dim conexion As New OleDbConnection(RutaPublica)
                conexion.Open()
    
                SQL = "SELECT * FROM TB_025_Maestro_de_Prestamo WHERE Maestro_de_Prestamos_No = '" & TxtNumero_de_Prestamo.Text & "'"
                DA = New OleDbDataAdapter(SQL, conexion)
                DS = New DataSet
    
                DA.Fill(DS, "TB_025_Maestro_de_Prestamo")
    
                lista = DS.Tables("TB_025_Maestro_de_Prestamo").Rows.Count
                    TxtNumero_de_Prestamo.Text = Format(CInt(DS.Tables("TB_025_Maestro_de_Prestamo").Rows(0).Item("Maestro_de_Prestamos_Sucursal")), "000") & "-" & Format(CInt(DS.Tables("TB_025_Maestro_de_Prestamo").Rows(0).Item("Maestro_de_Prestamos_No")), "000000")
                    Lbl_Codigo_Prestamo.Text = DS.Tables("TB_025_Maestro_de_Prestamo").Rows(0).Item("Maestro_de_Prestamos_No")
                    Lbl_Codigo_Cliente.Text = DS.Tables("TB_025_Maestro_de_Prestamo").Rows(0).Item("Maestro_de_Prestamos_Codigo_Cliente")
    
    
            Catch ex As Exception
                MsgBox("No se pudo Registrar los datos. " & ex.Message, MsgBoxStyle.Critical, "Error")
            End Try
            Call Bsucar_Nombre_y_Cedula()
    
    
        End Sub
    Que tendría que modificar?

    jueves, 16 de abril de 2020 22:40

Todas las respuestas

  •   

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.   

    Oystein Edwards 

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

     

    jueves, 16 de abril de 2020 23:22
    Moderador
  • He realizado varias preguntas y solo me ponen este mensaje, esto funciona o no, porque la verdad no siento que ayudan o por lo menos yo he tenido mala suerte
    viernes, 17 de abril de 2020 4:32
  • Hola,

    prueba con un método que seleccione un connectionstring dependiendo del parámetro que le envies y que te devuelva el connectionstring como resultado:

    Sub SeleccionarConexion(string tipoConexion)

    Dim resultado As string

    if(tipoConexion.Equals("Acces"))

    resultado = "Cadena de conexion1"

    else

    resultado = "CAdena de conexion2"

    retun resultado

    Después:

    conexion = SeleccionarConexion("Access")

    viernes, 17 de abril de 2020 9:03
  • Hola:
    > por lo menos yo he tenido mala suerte  <
    Vamos a ver si ahora tienes un poco de suerte

    Prueba con esto

    Friend Sub Verificar_Prestamos_por_el_Nuemro(ByVal vsConexion As String)
            Dim loDataTable As New DataTable
            Dim lsQuery As String = "SELECT * FROM TB_025_Maestro_de_Prestamo WHERE Maestro_de_Prestamos_No = '" & TxtNumero_de_Prestamo.Text & "'"
            Try
                If vsConexion = "SQL" Then
                    Using loConexion As New SqlConnection(TU_CADENA_DE_CONEXION_SQL)
                        Using loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                ElseIf vsConexion = "ACCESS" Then
                    Using loConexion As New OleDbConnection(TU_CADENA_DE_CONEXION_ACCESS)
                        Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Verificar_Prestamos_por_el_Nuemro", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Dim lista As Byte = loDataTable.Rows.Count
            TxtNumero_de_Prestamo.Text = Format(CInt(loDataTable.Rows(0).Item("Maestro_de_Prestamos_Sucursal")), "000") & "-" & Format(CInt(loDataTable.Rows(0).Item("Maestro_de_Prestamos_No")), "000000")
            Lbl_Codigo_Prestamo.Text = loDataTable.Rows(0).Item("Maestro_de_Prestamos_No")
            Lbl_Codigo_Cliente.Text = loDataTable.Rows(0).Item("Maestro_de_Prestamos_Codigo_Cliente")
            Call Bsucar_Nombre_y_Cedula()
        End Sub
       
    P.D.
    Su uso seria: Verificar_Prestamos_por_el_Nuemro("SQL") o Verificar_Prestamos_por_el_Nuemro("ACCESS")

    Un saludo desde Bilbo
    Carlos
    viernes, 17 de abril de 2020 10:04
  • Te voy a proponer algo que es bastante distinto de lo que te han indicado en las respuestas anteriores. Al principio parece un poco más complicado, pero a la larga te simplifica mucho el programa, sobre todo si tienes que acceder a las bases de datos desde muchos sitios.

    Existe en las librerías del Framerok una interfaz que se llama IDbConnection. Tanto OleDbConnection como SqlConnection implementan IDbConnection. Por lo tanto, si haces Dim conexion as IDbConnection entonces es lícito hacer esto:

    conexion = new OleDbConnection(...)

    y también

    conexion = new SqlConnection(...)

    Obviamente usarías un "if" para hacer una de esas dos cosas dependiendo de la variable que mencionabas que vale "Access" o "SQL_Server".

    Y después, en todo el programa usas ese objeto conexión. Por ejemplo, si necesitas un SqlComand o un OleDbCommand para acceder a la base de datos, no tienes que duplicar el código sino que haces solo esto:

    Dim cmd As IDbCommand = conexion.CreateCommand()

    y entonces ese cmd te sirve indistintamente para Access o SQL Server.

    Y de manera muy similar se usan también otros objetos que empiezan por IDb en lugar de Sql y OleDb: IDbDataAdapter, IDbParameter, IDbDataReader, etc., etc., de manera que puedes escribir un código universal que vale para todas las bases de datos, con la única salvedad de ese sitio inicial donde asignas un valor a la variable "conexion", que es el único que necesita un "if" dependiendo del tipo de la base de datos.

    viernes, 17 de abril de 2020 13:42
  • Te voy a proponer algo que es bastante distinto de lo que te han indicado en las respuestas anteriores. Al principio parece un poco más complicado, pero a la larga te simplifica mucho el programa, sobre todo si tienes que acceder a las bases de datos desde muchos sitios.

    Existe en las librerías del Framerok una interfaz que se llama IDbConnection. Tanto OleDbConnection como SqlConnection implementan IDbConnection. Por lo tanto, si haces Dim conexion as IDbConnection entonces es lícito hacer esto:

    conexion = new OleDbConnection(...)

    y también

    conexion = new SqlConnection(...)

    Obviamente usarías un "if" para hacer una de esas dos cosas dependiendo de la variable que mencionabas que vale "Access" o "SQL_Server".

    Y después, en todo el programa usas ese objeto conexión. Por ejemplo, si necesitas un SqlComand o un OleDbCommand para acceder a la base de datos, no tienes que duplicar el código sino que haces solo esto:

    Dim cmd As IDbCommand = conexion.CreateCommand()

    y entonces ese cmd te sirve indistintamente para Access o SQL Server.

    Y de manera muy similar se usan también otros objetos que empiezan por IDb en lugar de Sql y OleDb: IDbDataAdapter, IDbParameter, IDbDataReader, etc., etc., de manera que puedes escribir un código universal que vale para todas las bases de datos, con la única salvedad de ese sitio inicial donde asignas un valor a la variable "conexion", que es el único que necesita un "if" dependiendo del tipo de la base de datos.

    Me interesa mucho este método pues como bien dices tengo acceder a las bases de datos desde muchos sitios, podrías ayudarme a modificar el código que puse en el ejemplo como sugieres, pues con una primera vez que vea como es puedo seguir modificando el código.

    Gracias de antemano

    viernes, 17 de abril de 2020 16:37
  • Hola:
    > tengo acceder a las bases de datos desde muchos sitios <
    Desde la cantidad de sitios que tengas que acceder NO es lo que cuenta, lo que cuenta es a cuantos tipos de bases de datos tienes que acceder (SQL Server, Oracle, Acces, MySql, etc)

    Un saludo desde Bilbo
    Carlos
    viernes, 17 de abril de 2020 17:03
  • Hola:
    > tengo acceder a las bases de datos desde muchos sitios <
    Desde la cantidad de sitios que tengas que acceder NO es lo que cuenta, lo que cuenta es a cuantos tipos de bases de datos tienes que acceder (SQL Server, Oracle, Acces, MySql, etc)

    Un saludo desde Bilbo
    Carlos
    Por favor podría ayudar a modificar el código con las IDb...  como mencionan mas arriba?
    viernes, 17 de abril de 2020 18:01
  • Me interesa mucho este método [...] podrías ayudarme a modificar el código que puse en el ejemplo

    '(1) Poner las siguientes líneas en una subrutina y llamarla cada vez que necesitemos una conexión
    
    Dim conexion As IDbConnection
    
    If TipoDeseado="Access" Then
        conexion = New OleDbConnection("Poner aquí la cadena de conexión para Access")
    Else If TipoDeseado="SQL_Server" Then
        conexion = New SqlDbConnection("Poner aquí la cadena de conexión para SQL Server")
    Else
        'Aquí generar un mensaje de error
    End If
    
    
    '(2) ejemplo de cómo obtener datos
    Dim conexion As IDbConnection = (inicializar aquí la variable llamando a la subrutina mencionada en (1))
    conexion.Open()
    
    SQL = "SELECT * FROM TB_025_Maestro_de_Prestamo WHERE Maestro_de_Prestamos_No = '" & TxtNumero_de_Prestamo.Text & "'"
    Dim cmd as IDbCommand = conexion.CreateCommand()
    cmd.ComandText = SQL
    Dim DA As New DbDataAdapter()
    DA.SelectCommand = cmd
    
    Dim DS As New DataSet
    DA.Fill(DS, "TB_025_Maestro_de_Prestamo")
    
    ' A continuación todo lo que haces con DS no cambia, es igual que en tu método
    
    


    viernes, 17 de abril de 2020 20:13
  • Ese código no funciona así como esta escrito, estuve intentando mortificarlo, pero no pude.
    viernes, 17 de abril de 2020 21:45
  • Hola:
    > por lo menos yo he tenido mala suerte  <
    Vamos a ver si ahora tienes un poco de suerte

    Prueba con esto

    Friend Sub Verificar_Prestamos_por_el_Nuemro(ByVal vsConexion As String)
            Dim loDataTable As New DataTable
            Dim lsQuery As String = "SELECT * FROM TB_025_Maestro_de_Prestamo WHERE Maestro_de_Prestamos_No = '" & TxtNumero_de_Prestamo.Text & "'"
            Try
                If vsConexion = "SQL" Then
                    Using loConexion As New SqlConnection(TU_CADENA_DE_CONEXION_SQL)
                        Using loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                ElseIf vsConexion = "ACCESS" Then
                    Using loConexion As New OleDbConnection(TU_CADENA_DE_CONEXION_ACCESS)
                        Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                            loDataAdapter.Fill(loDataTable)
                        End Using
                    End Using
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Verificar_Prestamos_por_el_Nuemro", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            Dim lista As Byte = loDataTable.Rows.Count
            TxtNumero_de_Prestamo.Text = Format(CInt(loDataTable.Rows(0).Item("Maestro_de_Prestamos_Sucursal")), "000") & "-" & Format(CInt(loDataTable.Rows(0).Item("Maestro_de_Prestamos_No")), "000000")
            Lbl_Codigo_Prestamo.Text = loDataTable.Rows(0).Item("Maestro_de_Prestamos_No")
            Lbl_Codigo_Cliente.Text = loDataTable.Rows(0).Item("Maestro_de_Prestamos_Codigo_Cliente")
            Call Bsucar_Nombre_y_Cedula()
        End Sub
       
    P.D.
    Su uso seria: Verificar_Prestamos_por_el_Nuemro("SQL") o Verificar_Prestamos_por_el_Nuemro("ACCESS")

    Un saludo desde Bilbo
    Carlos
    Gracias esta es la opción que voy a utilizar pues las demás se veían mas sencillas pero no funcionaron
    viernes, 17 de abril de 2020 21:54