jueves, 8 de noviembre de 2012

[ADO.NET] Ms Access y arquitectura 64bit

 

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

clip_image001

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.

clip_image003

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

clip_image004

Y allí cambiar la opción mencionada a x86, con esto haremos que el .exe compile con compatibilidad a 32bits

clip_image006

Ahora si al ejecutar la aplicación funcionara sin problemas

clip_image007

 

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

clip_image009

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

18 comentarios:

  1. Con windows 7 ultimate 64 bit, visual studio.net 2012 y Access 2012 he tenido que cambiar el cpu de destino a X86.

    ResponderEliminar
  2. hola Ricardo

    pero usas te ACE.OLEDB, como proveedor en el connection string ?



    saludos

    ResponderEliminar
  3. 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

    ResponderEliminar
  4. Excelente,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

    ResponderEliminar
  5. hola James

    no 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

    ResponderEliminar
  6. HOla Leandro
    Ya 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

    ResponderEliminar
  7. Revisando mi conexion me percate que en la parte del password; lo habia escrito mal; ya lo corregi:

    INVENTARIO_SLB; sigo teniendo el mismo problema, no se puede conectar a la Base de Datos de Sql Server 2008; estoy usando un smartdevice

    saludos.

    ResponderEliminar
  8. hola antonio

    pero 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

    ResponderEliminar
  9. Gracias Leandro. Por tu pronta respuesta.

    EStoy 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.

    ResponderEliminar
  10. 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.
    OleDbConnection 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();

    ResponderEliminar
  11. 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.
    OleDbConnection 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();

    ResponderEliminar
  12. hola miguel

    hatsa 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

    ResponderEliminar
  13. Estoy totalmente agradecida. gracias por compartir tus conocimientos. Éxitos :)

    ResponderEliminar
  14. Hola 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

    ResponderEliminar
  15. hola Pepe

    entiendo 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

    ResponderEliminar
  16. 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

    ResponderEliminar
    Respuestas
    1. hola
      Pero 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

      Eliminar
  17. 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

    ResponderEliminar