none
Agregar parámetro a consulta con DbProviderFactory RRS feed

  • Pregunta

  • Hola a todos:

    Estoy intentando crear una consulta utilizando DbProviderFactory, uno de los problemas lo tengo en la forma de añadir el parámetro a la consulta, ya que no se que sintaxis utilizar en este caso.

    Public Shared Function CargaDatosCapacidadCrecimiento() As DataTable Dim valor As Integer = AccesoLogica.ObtenerPeriodos() Dim _comando As DbCommand = MetodosDatos.CrearComando() _comando.CommandText = "SELECT Descripcion, Ejer_01, Ejer_02, Ejer_03, Ejer_04, Ejer_05 " & "FROM Varios WHERE Cod_Empresa = @empresa AND Balance = 'CAPCREC' AND ORDEN IN ('585','586','587','588') ORDER BY Orden" With _comando.Parameters .Clear() .AddWithValue("@empresa", VarGlobal.StrCodEmpresa) End With Return MetodosDatos.EjecutarComandoSelect(_comando)

    End Function

    El método AddWithValue utilizado en access2007 y/o sqlserver es correcto, pero con la factoría de proveedores no me lo coge y querría saber como añadirlo correctamente con DbProviderFactory.

    Un cordial saludo a todos y FELIZ NAVIDAD.

    Gemma

    jueves, 24 de diciembre de 2015 7:00

Respuestas

  • "gemma_campillo" escribió:

    > Dim _comando As DbCommand = ...
    >
    > With _comando.Parameters
    >  .Clear()
    >  .AddWithValue("@empresa", VarGlobal.StrCodEmpresa)
    > End With
    >
    > El método AddWithValue utilizado en access2007 y/o sqlserver es correcto,
    > pero con la factoría de proveedores no me lo coge y querría saber como
    > añadirlo correctamente con DbProviderFactory.

    Buenos días, Gemma:

    Ese problema no tiene nada que ver con que estés o no utilizando la factoría de proveedores. El tema es que has declarado un objeto DbCommand (que es la clase base de los objetos OleDbCommand, SqlCommand, etc.), y ese objeto NO DISPONE en su interfaz de un método llamado AddWithValue, de ahí que obtengas el error apropiado en tiempo de diseño.

    Tan solo tienes que crear el parámetro y añadirlo al objeto DbCommand tal y como indico a continuación:

            ' Creamos el parámetro.
            Dim param As DbParameter = _comando.CreateParameter()
    
    
            ' Le asignamos el nombre del parámetro.
            param.ParameterName = "@empresa"
    
            ' Le asignamos su valor.
            param.Value = VarGlobal.StrCodEmpresa
    
    
            ' Añadimos el parámetro a la colección Parameters del objeto DbCommand.
            _comando.Parameters.Add(param)

    Por cierto, no es necesario que llames al método Clear de la colección Parameters, porque se comprende que el método MetodosDatos.CrearComando() está devolviendo un nuevo objeto DbCommand que aún no tiene ningún parámetro en su colección Parameters, y si por casualidad los tienes, ¡mal hecho! Porque ese método se tendría que limitar a devolver exclusivamente un objeto DbCommand apropiado a la factoría que actualmente estés utilizando.


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 8:59
    Moderador
  • "gemma_campillo" escribió:

    > Enrique esa clase DataAccessInvariant, en el foro o mejor dicho buscando por
    > dicho nombre, no la he visto. Voy a ver por Internet si por el contrario está.

    Pues yo la he encontrado en este mismo foro en un abrir y cerrar de ojos ;-)

    https://social.msdn.microsoft.com/Forums/es-ES/home?searchTerm=DataAccessInvariant

    Se encuentra en un proyecto de demostración que podrás descargas desde el siguiente enlace:


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo jueves, 24 de diciembre de 2015 12:10
    jueves, 24 de diciembre de 2015 12:02
    Moderador

Todas las respuestas

  • La forma de indicar los parámetros en la sentencia SELECT depende del proveedor de datos utilizado.

    ¿Cómo has implementado el método MetodosDatos.CrearComando?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 24 de diciembre de 2015 8:51
  • "gemma_campillo" escribió:

    > Dim _comando As DbCommand = ...
    >
    > With _comando.Parameters
    >  .Clear()
    >  .AddWithValue("@empresa", VarGlobal.StrCodEmpresa)
    > End With
    >
    > El método AddWithValue utilizado en access2007 y/o sqlserver es correcto,
    > pero con la factoría de proveedores no me lo coge y querría saber como
    > añadirlo correctamente con DbProviderFactory.

    Buenos días, Gemma:

    Ese problema no tiene nada que ver con que estés o no utilizando la factoría de proveedores. El tema es que has declarado un objeto DbCommand (que es la clase base de los objetos OleDbCommand, SqlCommand, etc.), y ese objeto NO DISPONE en su interfaz de un método llamado AddWithValue, de ahí que obtengas el error apropiado en tiempo de diseño.

    Tan solo tienes que crear el parámetro y añadirlo al objeto DbCommand tal y como indico a continuación:

            ' Creamos el parámetro.
            Dim param As DbParameter = _comando.CreateParameter()
    
    
            ' Le asignamos el nombre del parámetro.
            param.ParameterName = "@empresa"
    
            ' Le asignamos su valor.
            param.Value = VarGlobal.StrCodEmpresa
    
    
            ' Añadimos el parámetro a la colección Parameters del objeto DbCommand.
            _comando.Parameters.Add(param)

    Por cierto, no es necesario que llames al método Clear de la colección Parameters, porque se comprende que el método MetodosDatos.CrearComando() está devolviendo un nuevo objeto DbCommand que aún no tiene ningún parámetro en su colección Parameters, y si por casualidad los tienes, ¡mal hecho! Porque ese método se tendría que limitar a devolver exclusivamente un objeto DbCommand apropiado a la factoría que actualmente estés utilizando.


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 8:59
    Moderador
  • Hola querido maestro:

    Bueno, estoy intentando implementar el uso de factoría de proveedores a ver si lo hago bien. Evidentemente y buscando por el foro y por google, me he topado con tu ejemplo del uso de factorías con dbProviderFactory, el cual lo he ido estudiando e implementando hasta que me encuentro con el tema de los parámetros. Empecé ayer y quiero ver si soy capaz de hacerlo.

    El método de configuración para las cadenas es el siguiente:

    Option Explicit On Option Strict On Imports System.Configuration Public Class ConfigurationConnectionString Private m_connString As String Private m_name As String Private m_providerName As String ''' <summary> ''' Crea una nueva instancia de la clase ApplicationConfig ''' con el nombre de la cadena de conexión existente en el ''' archivo de configuración de la aplicación. ''' </summary> ''' <param name="nameConnectionString">Nombre de la cadena de conexión.</param> Public Sub New(nameConnectionString As String) Try ' Obtenemos el archivo de configuración de la aplicación. ' Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) ' Devolvemos la cadena de conexión que se ' corresponda con el nombre especificado. ' Dim cs As ConnectionStringSettings = _ config.ConnectionStrings.ConnectionStrings(nameConnectionString) If (cs Is Nothing) Then _ Throw New ArgumentNullException( _ "nameConnectionString", _ "El nombre de la cadena de conexión no existe en el archivo de configuración de la aplicación.") m_connString = cs.ConnectionString If (m_connString = String.Empty) Then _ Throw New ArgumentNullException( _ "nameConnectionString", _ "No existe la cadena de conexión en el valor con nombre especificado.") m_providerName = cs.ProviderName If (m_providerName = String.Empty) Then _ Throw New ArgumentNullException( _ "nameConnectionString", _ "El proveedor .net especificado actualmente no se encuentra soportado.") m_name = cs.Name ' También se puede obtener la cadena de conexión de alguna de las siguientes maneras ' ' Return ConfigurationManager.ConnectionStrings(name).ConnectionString Catch ex As Exception Throw End Try End Sub ''' <summary> ''' Devuelve la cadena de conexión existente en el ''' archivo de configuración de la aplicación. ''' </summary> Public ReadOnly Property ConnectionString As String Get Return m_connString End Get End Property ''' <summary> ''' Devuelve el nombre de la cadena de conexión utilizada. ''' </summary> Public ReadOnly Property Name As String Get Return m_name End Get End Property ''' <summary> ''' Devuelve el proveedor de datos utilizado en la ''' cadena de conexión existente en el archivo de ''' configuración de la aplicación. ''' </summary> Public ReadOnly Property ProviderName As String Get Return m_providerName End Get End Property

    '//Este último es el que actualmente hago servir para Access 2007 con contraseña.

    Public Shared Function CadenaConexion() As String Try Dim cnx As String = ConfigurationManager.ConnectionStrings("MiCadenaConexion").ConnectionString Return cnx & System.Text.Encoding.Default.GetString(System.Convert.FromBase64String("valor en base 64")) Catch exc As Exception Throw exc End Try End Function End Class



    • Editado gemma_campillo jueves, 24 de diciembre de 2015 9:27 Ampliación.
    • Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 9:29 Eliminar el valor en base64 de la contraseña de la base de datos.
    jueves, 24 de diciembre de 2015 9:17
  • Vamos a suponer que en lugar de un único parámetro tienes varios parámetros de entrada en tu consulta SQL de acción o de selección. Para no repetir tanto código a la hora de crear parámetros de entrada (repito, PARÁMETROS DE ENTRADA), tan sólo tienes que incluir en tu capa de acceso a datos una función compartida que te devuelva un objeto DbParameter debidamente configurado con los valores especificados:

        ''' <summary>
        ''' Devuelve un objeto DbParameter apropiado al tipo del objeto DbCommand especifidado. 
        ''' </summary>
        ''' <param name="cmd">Objeto Command debidamente configurado.</param>
        ''' <param name="name">Nombre del parámetro.</param>
        ''' <param name="value">Valor del parámetro.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function CreateParameter(cmd As DbCommand, name As String, value As Object) As DbParameter
    
            If (cmd Is Nothing) Then
                Throw New ArgumentException("El valor del comando no es válido.")
            End If
    
            Dim param As DbParameter = cmd.CreateParameter()
            param.ParameterName = name
            param.Value = value
    
            Return param
    
        End Function

    Y ahora añadirías los parámetros a la colección Parameters del objeto DbCommand como indico a continuación:

            ' Añadimos el primer parámetro
            _comando.Parameters.Add(CreateParameter(_comando, "@empresa", VarGlobal.StrCodEmpresa))
    
            ' Añadimos un segundo parámetro
            _comando.Parameters.Add(CreateParameter(_comando, "@param2", valorParametro2))
    
            ' Añadimos el tercer parámetro
            _comando.Parameters.Add(CreateParameter(_comando, "@param3", valorParametro3))


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 9:23
    Moderador
  • "gemma_campillo" escribió:

    > estoy intentando implementar el uso de factoría de proveedores a ver si lo
    > hago bien. Evidentemente y buscando por el foro y por google, me he topado
    > con tu ejemplo del uso de factorías con dbProviderFactory, ...
    >

    Pues si dices que el código es mío (que por los comentarios existentes parece ser que así es), digo yo que estará bien. :-))

    > Este último es el que actualmente hago servir para Access 2007 con contraseña.
    >
    > Public Shared Function CadenaConexion() As String
    >      Try
    >
    >            Dim cnx As String = ConfigurationManager.ConnectionStrings("MiCadenaConexion").ConnectionString
    >            Return cnx & System.Text.Encoding.Default.GetString(System.Convert.FromBase64String("valor en base 64"))
    >
    >        Catch exc As Exception
    >            Throw exc
    >        End Try
    >    End Function

    Puedes seguir utilizando tu función CadenaConexion si así lo deseas, ya que a la cadena de conexión existente en el archivo de configuración de la aplicación, posteriormente se supone que le estás añadiendo el valor de la contraseña de la base de datos, que con tu permiso he eliminado su valor de tu mensaje, porque como te indiqué en su día, eso de encriptación tiene lo que yo de... ;-)

    Pero ¡claro! Ese procedimiento solo te servirá para utilizarlo exclusivamente con tu aplicación, no para cualquier aplicación que desarrolles, salvo que en todos tus proyectos que desarrolles utilices una base de datos de Access y la misma contraseña, por lo que en éste caso no tiene ningún sentido trabajar con una factoría de proveedores.

    La clase ConfigurationConnectionString descrita serviría para obtener la cadena de conexión del archivo de configuración de la aplicación (sección  <connectionStrings>) dependiendo del nombre invariable del proveedor de datos ("System.Data.OleDb", "System.Data.SqlClient", etc.) que figure en dicha cadena de conexión, por lo que en nuestra biblioteca de acceso a datos podríamos implementar clases que sirvan para trabajar tanto con Access, como con SQL Server o cualquier otro motor de datos.


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 9:50
    Moderador
  • Hola:

    Maestro, es que si que entiendo lo de la factoría, en tu ejemplo  queda perfectamente explicado, pero claro ahora tengo que ir adaptándolo a la aplicación. Ya verás que lo hago, solamente que tengo que corregir y adaptar algunas cosillas.

    Bueno, gracias como siempre y no te digo nada más, ya lo sabes.

    Pasa un feliz día de Navidad y cuelga los bártulos de la programación que por un día no pasa nada.

    Un enorme abrazo como siempre.

    Gemma

    jueves, 24 de diciembre de 2015 10:00
  • Hola maestro:

    Solamente tengo una duda respecto a todo esto, he implementado tu función de parámetros en el método y la llamo de cualquier procedimiento de otra clase y perfecto, mira es asó como la he dejado:

    Public Shared Sub RellenoDatosSimuladorGridApalancamiento() Dim _comando As DbCommand = MetodosDatos.CrearComando() Dim cadenaConexion As String = ConfigurationConnectionString.CadenaConexion Using Cnn As New DbConnection(cadenaConexion) Cnn.Open() Dim cmd As DbCommand = Cnn.CreateCommand() 'Procedemos a grabar los datos en la tabla. cmd.CommandType = CommandType.StoredProcedure cmd.CommandText = "ProcActualSimulApalancmientoAuditoria" With _comando.Parameters .Add(MetodosDatos.CreateParameter(_comando, "@empresa", VarGlobal.StrCodEmpresa)) .Add(MetodosDatos.CreateParameter(_comando, "@orden", "460")) .Add(MetodosDatos.CreateParameter(_comando, "@SimulApalanc", VarGridSimulApalancamientoSimul(0))) End With cmd.ExecuteNonQuery()

    End sub

    La pregunta y última de verdad, es igual que has hecho la función para los parámetros, ¿Cómo podría hacer para el que tengo ahora que me da error:

    Using Cnn As New DbConnection(cadenaConexion)
    Me dice el error que "New no se puede usar en una clase declarada como "MustInHerit" y eso no lo acabo de entender. Bueno, si tienes tiempo ganas o cuando puedas, me lo explicas.

    Un abrazo.

    Gemma


    jueves, 24 de diciembre de 2015 10:18
  • "gemma_campillo" preguntó:

    > La pregunta y última de verdad, es igual que has hecho la función
    > para los parámetros, ¿Cómo podría hacer para el que tengo ahora
    > que me da error:
    >
    > Using Cnn As New DbConnection(cadenaConexion)
    >
    > Me dice el error que "New no se puede usar en una clase declarada
    > como "MustInHerit" y eso no lo acabo de entender. Bueno, si tienes
    > tiempo ganas o cuando puedas, me lo explicas.

    Normal que obtengas ese error, porque la clase DbConnection es la clase base de las clases OleDbConnection, SqlConnection, etc., estando su constructor New protegido (Protected), por no lo que no se puede crear una instancia de dicha clase con el operador New.

    Si vas a trabajar con una base de datos de Access, tienes que asignarle una nueva instancia de la clase OleDbConnection:

        Using Cnn As DbConnection = New OleDbConnection(cadenaConexion)

    Pero insisto que mientras que desde tu aplicación te encuentres trabajando exclusivamente con una base de datos de Access, no le veo yo sentido alguno que utilices objeto DbConnection y DbCommand. ¿?

    Para que tu aplicación pueda trabajar tanto con una base de datos de Access como con cualquier otra diferente, tendrías que añadir al archivo de configuración de la aplicación (app.config) la sección <connectionString>, y dentro de ella, asignar las cadenas de conexión con nombre que vas a utilizar, donde cada cadena de conexión tiene que llevar el nombre del proveedor invariable que va a usar dicha cadena de conexión. Sería algo parecido a lo siguiente:

     <connectionStrings>
        <add name="Access 2007" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Database1.accdb;Jet OLEDB:Database Password=contraseña" providerName="System.Data.OleDb" />
     </connectionStrings>

    Y al método que utilices para crear la factoría, tendrías que pasarle el nombre de la cadena de conexión apropiada, que para el ejemplo anterior sería "Access 2007".

    Pero si tu aplicación la tienes repleta de objetos OleDbConnection, OleDbCommand, OleDbDataAdapter y OleDbParameter, ¿para qué quieres trabajar con un proveedor de datos invariable? Tendrías que modificar prácticamente todo el acceso a datos que tienes implementado para sustituir dichos objetos por objetos comunes tipo DbConection, DbCommand, DbDataAdapter y DbParamenter. Tu verás si todo el trabajo de modificación merece o no la pena.


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 10:53
    Moderador
  • Gracias Enrique:

    La App.Config la tengo con todas las cadenas y funcionando solo precisaba aclarar lo que has explicado.

    Nada más, muchas gracias y mucha felicidad para ti u los tuyos.

    Gemma

    jueves, 24 de diciembre de 2015 10:57
  • "gemma_campillo" escribió:

    > La App.Config la tengo con todas las cadenas y funcionando
    > solo precisaba aclarar lo que has explicado.

    ¿Y todas las cadenas de conexión utilizan el proveedor invariable System.Data.OleDb? Te lo pregunto porque si tu intención es conectarte con una base de datos de SQL Server, entonces lo siguiente fallará a la hora de conectarte con la base de datos de SQL Server

        Using Cnn As DbConnection = New OleDbConnection(cadenaConexion)

    porque tendrías que asignar un objeto SqlConnection:

    Using Cnn As DbConnection = New SqlConnection(cadenaConexion)

    Donde cadenaConexion tendrá que contener una cadena de conexión válida para el proveedor de datos de SQL Server, la cual es distinta que la utilizada por el proveedor de datos OleDb, salvo que te desees conectar al servidor de SQL Server utilizando el proveedor de datos OleDb, cuestión ésta que no es recomendable.


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    jueves, 24 de diciembre de 2015 11:20
    Moderador
  • Hola Enrique:

    las App.Config está de la siguiente forma y despúes mas abajo muestro el form para mostrar las conexiones y los proveedores:

    <!--'/////////////////  CONEXION BASE DE DATOS. ////////////////////-->
      <connectionStrings>
        <!--<add name="MiCadenaConexion" connectionString="Provider=Microsoft.ACE.DB.12.0;Data Source = |DataDirectory|\gemmafin.accdb" providerName="System.Data.Common"/>-->
      <!--</connectionStrings>-->
        
        <add name="MiCadenaConexion" connectionString="Provider=Microsoft.ACE.DB.12.0;Data Source = |DataDirectory|\gemmafin.accdb;Jet DB:Database Password=xxxxxxxxx;" providerName="System.Data.Common"/>
         
      <!--'/////////////////////////////////////-->
    
      <!--<connectionStrings>-->
        <add name="PerseoSqlEx" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=PerseoSqlEx;Integrated Security=true;"/>
        <add name="NorthwindAccess" providerName="System.Data.Common" connectionString="Provider=Microsoft.Jet.DB.4.0;Data Source= C:\Users\Rafael\Mis documentos\Northwind.mdb;"/>
        <add name="PerseoSqlCe" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=|DataDirectory|\PerseoSqlCe.sdf;Mode=Read Write;SSCE:Database Password='contraseña';"/>
      </connectionStrings>
        

    Y estas son las llamadas del form:

    Imports System.Data.Common
    Imports System.Configuration
    Imports Capa_Logica
    
    
    Public Class frmMigracionBasesDatos
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Obtenemos un objeto DataTable con los provedores
            ' .NET registrados en el archivo machine.config.
            '
            Dim dt As DataTable = DataAccessInvariant.GetProviders()
    
            ' Enlazamos el control ComboBox con el objeto DataTable.
            '
            ComboBox1.DataSource = dt
            ComboBox1.DisplayMember = "Name"
            ComboBox1.ValueMember = "InvariantName"
    
        End Sub
    
        Private Sub ComboBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedValueChanged
    
            Label3.Text = Convert.ToString(ComboBox1.SelectedValue)
    
        End Sub
    
        Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
    
            ' Recuperamos los datos desde SQL Server
            'FillDataGridView("NorthwindSQL")
            FillDataGridView("PerseoSqlEx")
        End Sub
    
        Private Sub LinkLabel2_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel2.LinkClicked
    
            ' Recuperamos los datos desde Access
            FillDataGridView("NorthwindAccess")
    
        End Sub
    
        Private Sub LinkLabel3_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel3.LinkClicked
            ' Recuperamos los datos desde Sql Compact Ce 4.0
            FillDataGridView("PerseoSqlCe")
        End Sub
    
        Private Sub LinkLabel4_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel4.LinkClicked
            ' Recuperamos los datos desde Access 2007 32 bits
            FillDataGridView("MiCadenaConexion")
        End Sub
    
        Private Sub LinkLabel5_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel5.LinkClicked
            ' Recuperamos los datos desde Access 2007 32 bits
            FillDataGridView("PerseoMySql")
        End Sub
    
        'Private Function CadenaConexion() As String
        '    Dim cnx As String = ConfigurationManager.ConnectionStrings("MiCadenaConexion").ConnectionString
        '    Return cnx & System.Text.Encoding.Default.GetString(System.Convert.FromBase64String("contraseña"))
    
        'End Function
    
        Private Sub FillDataGridView(nameConnectionString As String)
            Try
                ' Creamos el acceso a datos mediante el nombre de la
                ' cadena de conexión existente en el archivo de
                ' configuración de la aplicación.
                '
                Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(nameConnectionString)
    
                ' Declaramos una variable Connection
                Using cnn As DbConnection = da.CreateConnection()
    
                    ' Creamos el Commando
                    '
                    Dim cmd As DbCommand = cnn.CreateCommand()
                    If nameConnectionString = "PerseoSqlEx" Then
                        cmd.CommandText = "SELECT * FROM Empresas"
                    ElseIf nameConnectionString = "NorthwindAccess" Then
                        cmd.CommandText = "SELECT * FROM Categories"
                    ElseIf nameConnectionString = "PerseoSqlCe" Then
                        cmd.CommandText = "SELECT * FROM Empresas"
                    ElseIf nameConnectionString = "MiCadenaConexion" Then
                        cmd.CommandText = "SELECT * FROM Varios"
                    ElseIf nameConnectionString = "PerseoMySql" Then
                        cmd.CommandText = "SELECT * FROM Flujos"
                    End If
    
                    ' Abrimos explícitamente la conexión para obtener
                    ' un lector de datos.
                    '
                    cnn.Open()
    
                    Dim dr As DbDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
    
                    ' Creamos un objeto DataTable
                    '
                    If nameConnectionString = "PerseoSqlEx" Then
                        Dim dt As New DataTable("Empresas")
                        'Cargamos el lector en el objeto DataTable.
                        dt.Load(dr)
    
                        ' Enlazamos el control DataGridView.
                        DataGridView1.DataSource = dt
    
                    ElseIf nameConnectionString = "NorthwindAccess" Then
                        Dim dt As New DataTable("Categories")
                        'Cargamos el lector en el objeto DataTable.
                        dt.Load(dr)
    
                        ' Enlazamos el control DataGridView.
                        DataGridView1.DataSource = dt
    
                    ElseIf nameConnectionString = "PerseoSqlCe" Then
                        Dim dt As New DataTable("Empresas")
                        'Cargamos el lector en el objeto DataTable.
                        dt.Load(dr)
    
                        ' Enlazamos el control DataGridView.
                        DataGridView1.DataSource = dt
    
                    ElseIf nameConnectionString = "MiCadenaConexion" Then
                        Dim dt As New DataTable("Varios")
                        'Cargamos el lector en el objeto DataTable.
                        dt.Load(dr)
    
                        ' Enlazamos el control DataGridView.
                        DataGridView1.DataSource = dt
    
                        'ElseIf nameConnectionString = "PerseoMySql" Then
                        '    Dim dt As New DataTable("Varios")
                        '    'Cargamos el lector en el objeto DataTable.
                        '    dt.Load(dr)
    
                        ' Enlazamos el control DataGridView.
                        DataGridView1.DataSource = dt
                    End If
    
                End Using
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
    
        End Sub

    Un fuerte abrazo.

    Gemma



    jueves, 24 de diciembre de 2015 11:26
  • "gemma_campillo" escribió:

    > las App.Config está de la siguiente forma ...
    >
    >  <add name="NorthwindAccess" providerName="System.Data.Common"
    >    connectionString="Provider=Microsoft.Jet.DB.4.0;Data Source= C:\Users\Rafael\Mis documentos\Northwind.mdb;"/>
     
    Las otras cadenas de conexión están correctas, no así la indicada más arriba, porque yo al menos desconozco el proveedor invariable llamado System.Data.Common.

    Para conectarte a una base de Access inferior a Access 2007, también tienes que utilizar el proveedor invariable System.Data.OleDb.

    > despúes mas abajo muestro el form para mostrar las conexiones y los proveedores:
    >
    >  Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(nameConnectionString)
    >
    >  ' Declaramos una variable Connection
    >  Using cnn As DbConnection = da.CreateConnection()

    La clase DataAccessInvariant me suena que la publiqué en su día en este mismo foro. Si es así entonces no tienes por qué crear en el código instancias específicas de las clases OleDbConnection o SqlConnection para asignárselas a un objeto DbConnection, porque se supone que el método CreateConnection creará el objeto XXXConnection adecuado de acuerdo al proveedor de datos invariable existente en la cadena de conexión con nombre especificado en el método DataAccessInvariant.GetDataAccessInvariant, objeto éste que estará encapsulado en el objeto DbConnection devuelto por el método y referenciado por la variable cnn declarada también con el tipo DbConnection.


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 11:39
    Moderador
  • Hola:

    Enrique esa clase DataAccessInvariant, en el foro o mejor dicho buscando por dicho nombre, no la he visto. Voy a ver por Internet si por el contrario está.

    Un abrazo.

    Gemma

    jueves, 24 de diciembre de 2015 11:50
  • "gemma_campillo" escribió:

    > Enrique esa clase DataAccessInvariant, en el foro o mejor dicho buscando por
    > dicho nombre, no la he visto. Voy a ver por Internet si por el contrario está.

    Pues yo la he encontrado en este mismo foro en un abrir y cerrar de ojos ;-)

    https://social.msdn.microsoft.com/Forums/es-ES/home?searchTerm=DataAccessInvariant

    Se encuentra en un proyecto de demostración que podrás descargas desde el siguiente enlace:


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta gemma_campillo jueves, 24 de diciembre de 2015 12:10
    jueves, 24 de diciembre de 2015 12:02
    Moderador
  • Maestro:

    Esa ya la tengo, es de donde he sacado toda la información para ir montando esto.

    Lo habré mirado mal, porque ayer la encontré en el foro y es la que cogido para montar toda este tinglado.

    Voy haciendo y ya me voy aclarando, paso a paso.

    Venga, hasta ahora.

    Gemma

    jueves, 24 de diciembre de 2015 12:10
  • "gemma_campillo" escribió:

    > Esa ya la tengo, es de donde he sacado toda la información para ir montando esto.

    Ya decía yo que me era familiar el código que has publicado. Pues esa es la clase DataAccessInviariant que publiqué en su día, y que la acabo de actualizar hace unos minutos para eliminar todas las instrucciones Throw existentes, por lo que si lo deseas descarga de nuevo el archivo.

    Esa clase, como la clase ConfigurationConnectionString, son para insertarlas en algún proyecto de biblioteca de clases (*.dll) de tal manera que ésta pueda ser referenciada por otros proyectos. Pero el archivo app.config deberá pertenecer al proyecto Windows Forms, no al proyecto *.dll. ¿Me explico? ;-)


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 24 de diciembre de 2015 12:24
    Moderador
  • Hola maestro:_

    Ahora la voy a copiar, pero te comento que ya lo tengo en un proyecto de clases. Todo perfecto.

    Voy a ir a por la nueva que ha hecho.

    Te comento que estas cosas así que son importantes a mi parecer, no estaría nada mal que las pusieses en tu web o sea en las páginas de Softjaén. Yo siempre que quiero algo como lo de compactar la base de datos, etc., consulto esas páginas desde hace años y siempre he aprendido de ellas. Eso sería una manera de acceder a las miles de respuestas que has dado y que algunas veces son repetitivas por desconocimiento de la web por los usuarios y si la gente las conoce seguro que aprenderán mucho de ellas, bueno solo es un comentario.

    Un abrazo maestro.

    Gemma

    jueves, 24 de diciembre de 2015 13:42