Principales respuestas
Agregar parámetro a consulta con DbProviderFactory

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
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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 9:00
- Marcado como respuesta gemma_campillo jueves, 24 de diciembre de 2015 9:27
-
"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
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 .NETPíldoras JS
Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ... -
"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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 9:00
- Marcado como respuesta gemma_campillo jueves, 24 de diciembre de 2015 9:27
-
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.
-
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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 9:24
-
"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 FunctionPuedes 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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 10:00
-
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
-
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
- Editado gemma_campillo jueves, 24 de diciembre de 2015 10:24
-
"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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 10:53
-
-
"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.
- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 11:24
-
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
- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 12:46 Eliminar valores de contraseñas.
-
"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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 11:55
-
-
"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
-
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
-
"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.- Editado Enrique M. MontejoModerator jueves, 24 de diciembre de 2015 12:25
-
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