Cuando desarrollamos bajo una plataforma con arquitectura de 64 bits se pueden presentar problema si la db usada se trata de Ms Access
Este problema se presenta porque el motor que usa para establecer la conexión desde código no provee compatibilidad con esta arquitectura
Para efectuar el artículo se hizo uso una PC con arquitectura 64bits
Base de datos .mdb
Para demostrar el problema se confecciono un ejemplo simple
Una base de datos Access 2000 integrada en proyecto la cual lista contactos en un grid
string connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Contactos.mdb;User Id=admin;Password=;"; try { using (OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); string query = "SELECT * FROM Contactos"; OleDbCommand cmd = new OleDbCommand(query, conn); OleDbDataAdapter da = new OleDbDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); dataGridView1.DataSource = dt; } } catch (Exception ex) { MessageBox.Show(ex.Message); }
El proveedor utilizado
Provider=Microsoft.Jet.OLEDB.4.0
Si se ejecuta sin realizar ningún otro cambio se obtendrá
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
Para que esto no suceda la solución es cambiar el Platform Target del proyecto, para esto solo se debe ir a la propiedades del proyecto
Y allí cambiar la opción mencionada a x86, con esto haremos que el .exe compile con compatibilidad a 32bits
Ahora si al ejecutar la aplicación funcionara sin problemas
Base de datos .accdb
Otra alternativa que podría evaluarse es la utilización de ACE.OLEDB como proveedor para trabajar con la db Ms Access, para ello seguramente se necesite instalar
Componente redistribuible del motor de base de datos de Microsoft Access 2010
Nota: si se tiene el Office 2010 (o superior) en la pc quizás no se requiera la instalación
Al cambiar de proveedor, ya no se usara Jet por lo que se define
Provider=Microsoft.ACE.OLEDB.12.0
Al ejecutar la aplicación funciona correctamente más allá de estar definida para compilar a 64bits
Nota: también se probó ACE.OLEDB con una base de datos .mdb (generada con Ms Access 2010 pero grabada con compatibilidad con Access 2000) pudiendo establecer la conexión correctamente sin que afectara la arquitectura 64bits
Conclusión
Si se quiere hacer uso de Jet como proveedor para establecer la conexión a los datos será necesario cambiar en el proyecto la plataforma a la cual se compila
Para evitar el problema se hará uso del proveedor ACE.OLEDB el cual proporciona compatibilidad con 64bit
Con windows 7 ultimate 64 bit, visual studio.net 2012 y Access 2012 he tenido que cambiar el cpu de destino a X86.
ResponderEliminarhola Ricardo
ResponderEliminarpero usas te ACE.OLEDB, como proveedor en el connection string ?
saludos
un favor mira tengo este problema hice todo lo que dijiste, instale access database engine x64, cambie la compilacion a plataforma x86 y nada aun asi me da el error win7 64 bits, access 2013 y el error El proveedor ‘Microsoft.ACE.OLEDB.12.0′ no está registrado en el equipo local. una ayudita por favor mi correo es chuckyjames@hotmail.com
ResponderEliminarExcelente,gracias estaba intentando leer un excel y me enviaba erro, el problema se debia a que mi laptop es 64bit y tenia que cambiar la plataforma de destino de compilacion a x86
ResponderEliminarhola James
ResponderEliminarno se si puedes ejecutar la aplciacion desde otra pc para ver si sucede lo mismo
la db la has creando con el access 2013? o fue con una version anterior
porque creo que existe un ACE.OLEDB.14.0
http://www.codeproject.com/Questions/524760/ConnectionplusStringplusMSplusAccessplus2013
saludos
HOla Leandro
ResponderEliminarYa pude colocar la libreria Imports System.Data.SqlClient en añadir referencia; pero tengo el siguiente problema.
No puedo conectarme a la Bases de Datos de Sql Server 2008. Este es mi codigo que uso para la conexion.
Dim sCnn As String
Dim da As New SqlDataAdapter
Dim con As SqlConnection
'Se crea la conexion con la BD de Sql Server 2008
Try
sCnn = "Data Source = ACHTOSOFT-PC\SQLEXPRESS; Initial Catalog = INVENTARIO_SLB; user id = INVENTARIO_SLB; password = INEVNTARIO_SLB"
con = New SqlConnection
con.Open()
MessageBox.Show("Conexion Exitosa")
Catch ex As Exception
MessageBox.Show("NO hay Conexion con BD")
End Try
Revisando mi conexion me percate que en la parte del password; lo habia escrito mal; ya lo corregi:
ResponderEliminarINVENTARIO_SLB; sigo teniendo el mismo problema, no se puede conectar a la Base de Datos de Sql Server 2008; estoy usando un smartdevice
saludos.
hola antonio
ResponderEliminarpero desde un smartdevice no deberias conectarte directo a la base de datos, la verdad no lo veo una buena idea
deberias crear servicio web (podrian ser de asp.net o sea asmx o de WCF) que expongan los datos, los servicios si se conectan directo a la db pero el smartdevice consume los servicios para obtener los datos
saludos
Gracias Leandro. Por tu pronta respuesta.
ResponderEliminarEStoy realizando un proyecto, de conexion de un smartdevice a una Base de Datos Sql SErver 2008.
La idea es no usar web services, buscare en internet, si es que se puede conectarse directamente a la Base de Datos de Sql Server 2008.
Gracias.
Nota: Otras librerias aparte de System.Data.SqlClient, que pueda hacer la conexion a la BD.
ayuda estoy trabajando con visual studio 2010 conexion de bd con access 2013 y me aparece un error 15 del provedor no es compatible ya agrege los componentes redistribuible y puse en propiedades del proyectoo x86 tal cual como dicen el codigo es este.
ResponderEliminarOleDbConnection connection;
OleDbCommand command;
//I used "provider=Microsoft.ACE.Oledb.12.0;Data Source= Database1.accdb" to connect from VB.net to Access 2010 but it doesn't work on 2013. Please tell me how ???
connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\miguelalejandro\Documents\Visual Studio 2010\Projects\promociones\promocion.accdb;Persist Security Info=False");
connection.Open();
command = connection.CreateCommand();
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM promociones ", connection);
OleDbCommand ComandoMySQL = new OleDbCommand("SELECT * FROM promociones ", connection);
DataSet ds = new DataSet();
da.FillSchema(ds, SchemaType.Mapped, "promociones");
da.Fill(ds, "promociones");
DataTable mitabla = new DataTable("promociones");
da.Fill(mitabla);
//dataGridView2.DataSource = mitabla;
dataGridView1.DataSource = mitabla;
ComandoMySQL.ExecuteNonQuery();
ayuda estoy trabajando con visual studio 2010 conexion de bd con access 2013 y me aparece un error 15 del provedor no es compatible ya agrege los componentes redistribuible y puse en propiedades del proyectoo x86 tal cual como dicen el codigo es este.
ResponderEliminarOleDbConnection connection;
OleDbCommand command;
//I used "provider=Microsoft.ACE.Oledb.12.0;Data Source= Database1.accdb" to connect from VB.net to Access 2010 but it doesn't work on 2013. Please tell me how ???
connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\miguelalejandro\Documents\Visual Studio 2010\Projects\promociones\promocion.accdb;Persist Security Info=False");
connection.Open();
command = connection.CreateCommand();
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM promociones ", connection);
OleDbCommand ComandoMySQL = new OleDbCommand("SELECT * FROM promociones ", connection);
DataSet ds = new DataSet();
da.FillSchema(ds, SchemaType.Mapped, "promociones");
da.Fill(ds, "promociones");
DataTable mitabla = new DataTable("promociones");
da.Fill(mitabla);
//dataGridView2.DataSource = mitabla;
dataGridView1.DataSource = mitabla;
ComandoMySQL.ExecuteNonQuery();
hola miguel
ResponderEliminarhatsa donde puedo ver el connection string es correcto
http://www.connectionstrings.com/access-2013/
cual es el error exacto que recibes ? buscaste por la descripcion del mismo en google a ver si da alguna pista
ademas si vas a cargar un grid para que usas un dataset, porque no directo un datatable
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM promociones ", connection);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
que funcion cumple esta ultima linea
ComandoMySQL.ExecuteNonQuery();
porque alli parece ejecutar algo de MySql
saludos
Estoy totalmente agradecida. gracias por compartir tus conocimientos. Éxitos :)
ResponderEliminarHola que tal. Estoy tratando de leer un excel con OLEDB.12.0, pero para hacerlo funcionar instale el access data base engine 2010 para que funciones, pero despues de instalarlo y querer correo mi aplicacion, esta no corrio y mucho menos me dijo en donde habia error. Desisntale el access data base engine y mi aplicacion corrio normal. Me podrian ayudar por favor???, estoy usando visual studio 2010
ResponderEliminarhola Pepe
ResponderEliminarentiendo que tienes una pc de 64bits, no ?
intentaste primero de compilar con un platform target con x86, o sea compilar la aplicaicon con compatibilidad a 32bits ?
lo que no me quedo claro es porque al desinstalar en engine de access funciono, o sea antes no funcionaba, instalas el engine y sigue sin funcionar y despues lo desinstalas y funciona?
si es asi, esta algo raro
saludos
Saludos, ya sé que este foro tienen mucho tiempo, mi problema es el siguiente: he realizado varios programas en Vb 6.0 con Access 2007, funciona perfectamente en cualquier máquina no importa que sistema operativo tenga, bien sea de 32 o 64 bits, el gran problema es cuando la pc tiene instalado Office de 64 bits Ya tuve ese problema antes cuando realizaba mis programas con access 2003, el detalle estaba solamente en esta línea: .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & App.Path & "\Bd.accdb;Persist Security Info=False;Jet OLEDB:Database Password=XXXxxx" solo cambie "4.0" por "12.0" y isto, pero necesito saber cual es el cambio que debo realizar para que is programas se adapten a Access de 64 bits? Gracias gabrielmendozap@gmail.com
ResponderEliminarhola
EliminarPero parece que ya tienes la solucion cambiando el connection string, podrias simplemente definir el connection string en el archivo de configuracion para poder cambiarlo sin necesidad de recompilar, no se si es eso a donde apunta la pregunta
saludos
hola he leído algunos el bloc y mi caso era que realice una aplicacion en windows 7 a 32 c# que tenia una coneccion (@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" + _ruta + "; Extended Properties ='Excel 8.0;'") y la quise migrar a una arquitectura 64 con windows 8 y obvio no funcionaba solo cambie mi coneccion a OleDbConnection(@"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + _ruta + "; Extended Properties ='Excel 12.0 Xml; HDR = YES'") he instale accesDatabaseengine_64, cambie la compilacion del proyecto a 64 y Listo... funciono como antes
ResponderEliminarHola
ResponderEliminarHe seguido los pasos que indicas, para el uso de "Provider=Microsoft.ACE.OLEDB.12.0", es decir, he instalado "AccessDatabaseEngine_X64" pero al ejecutar la aplicación sigo obteniendo el mensaje: "'El proveedor 'Microsoft.ACE.OLEDB.12.0' no está registrado en el equipo local.'"
¿qué me falta por hacer?
Saludos y gracias de antemano
Gracias a vos me recibí en el 2012!
ResponderEliminarAhora devuelta gracias a vos conservo mi trabajo! Sos un ídolo! Gracias por compartir tus conocimientos, siempre exactos y muy bien explicado todo! Millón de gracias!
solucione este problema de: Provider=Microsoft.ACE.OLEDB.12.0 instalando office 2013 32 bits e instalando AccessDatabaseEngine sobre windows 7 64 bits; pero ahora me sale otro problema: Excepción no controlada del tipo 'System.InvalidOperationException' en System.Data.dll.........ya me da bronca este visual studio 15 creo que es de lo peor este lenguaje.
ResponderEliminarInformación adicional: No se ha inicializado la propiedad ConnectionString.
Gracias...!!!
ResponderEliminar