conexion cadena asp accdb c# ms-access

cadena - Cómo crear una base de datos de Access usando C#y guardar continuamente datos en tiempo real en ella



connection string access vb (4)

Actualmente estoy en el proceso de crear una aplicación que funciona 24 horas al día, 7 días a la semana, y constantemente recopila información de un servidor OPC.

Lo que necesito hacer ahora es enviar esta información a una base de datos ( archivo .accdb ). Esto debe suceder muy, muy rápido. Obtengo un nuevo valor del servidor cada milisegundo y necesito enviar ese valor a la base de datos a la misma velocidad. Por último, estoy comprimiendo la base de datos en un archivo .zip a las 00:00 todos los días.

He estado buscando en la web como un maníaco, pero parece que no puedo encontrar un tutorial "actualizado". Todos los que he encontrado hasta ahora usan " Microsoft.Jet.OLEDB.4.0 " como proveedor pero no existe en mi PC con Windows 7.

He hecho una pequeña aplicación para probar las conexiones y voy a adjuntar mi código actual a continuación para darle una pista de lo que he intentado hasta ahora; sin embargo, nada de esto parece funcionar.

private void button1_Click(object sender, EventArgs e) { System.Reflection.Assembly oAssembly = System.Reflection.Assembly.GetExecutingAssembly(); System.IO.Stream oStream = oAssembly.GetManifestResourceStream("RSLogixDB.accdb"); System.IO.FileStream fileStream = new System.IO.FileStream("C://Users//sezettersth//Documents//RSLogixDB.accdb", System.IO.FileMode.Create); byte[] abyt = new byte[oStream.Length]; oStream.Read(abyt, 0, (int)oStream.Length); fileStream.Write(abyt, 0, (int)oStream.Length); fileStream.Close(); if (fileStream != null) { fileStream.Close(); fileStream = null; } if (oStream != null) { oStream = null; } }

Este es el primer enfoque que probé, aquí uso una clase casera que se usa para crear y escribir en archivos. No funcionó para .accdb-files, desafortunadamente. (Los comentarios en las primeras líneas incluyen proveedores que he intentado.

private void button1_Click(object sender, EventArgs e) { //sFileDia.ShowDialog(); //Provider=Microsoft.ACE.OLEDB.12.0 //Povider=.NET Framework Data Provider for OLE DB //Povider=Microsoft.Jet.OLEDB.4.0 //Driver={Microsoft Access Driver (*.mdb, *.accdb)}; //Data Source=C://Users//sezettersth//Documents//RSLogixDB.accdb; //Persist Security Info=False; //Provider=Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C://Users//sezettersth//Documents//RSLogixDB.accdb;Persist Security Info=False string RSLogixDB = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C://Users//sezettersth//Documents//RSLogixDB.accdb;Persist Security Info=False"; string RSLogixDBPath = "C://Users//sezettersth//Documents//RSLogixDB.accdb"; OleDbConnection connection = new OleDbConnection(RSLogixDB); string connectionStr = connection.ConnectionString; //OleDbDataReader dataReader = new OleDbDataReader(RSLogixDB); ImportExport textwriter = new ImportExport(); textwriter.setExportPath(RSLogixDBPath); textwriter.endExport(); }

Tiene que haber una solución simple para esto, no puedo ser el único que use Access sin el proveedor " Microsoft.Jet.OLEDB.4.0 ".

(No he iniciado el código para comprimir el archivo y si tiene una idea sobre cómo hacerlo, me complace escucharlo, pero el enfoque principal aquí es el problema de la base de datos).

ACTUALIZACIÓN: El problema puede no estar en el proveedor como inicialmente, Microsoft.ACE.OLEDB.12.0 me permite crear un archivo .accdb pero básicamente es un archivo txt vacío con una extensión elegante y no se puede abrir o usado con MS Access. ¿Cómo hago un archivo .accdb que funcione?


Creo que su conexión no se puede establecer porque el controlador Jet OLEDB no viene con Windows 7, pero debe instalarse por separado. Una forma de hacerlo es instalar Microsoft Access, otra forma es buscar el paquete redistribuible MDAC de Microsoft (MDAC = Microsoft Data Access Components).

Puede verificar si, y en caso afirmativo, qué versión de MDAC tiene siguiendo las instrucciones en el siguiente enlace:

http://support.microsoft.com/kb/301202/en-us




En cuanto a tu código

Para ser sincero, no entiendo lo que intentas lograr en las muestras de código que presentaste.
Por lo que puedo ver, simplemente estás creando un archivo RSLogixDB.accdb .
Tal vez me falta algo, pero no es así como creas una base de datos.

¿Ha buscado y probado el código en las respuestas a estas preguntas SO:

Ahora, algunas explicaciones más.

Jet vs ACE

Primero, el formato de archivo ACCDB es el resultado de una renovación completa de Jet ahora llamada ACE. Solo se usa con Access 2007/2010 y contiene nuevas funcionalidades que no son compatibles con versiones anteriores.

Para abrir dicho archivo, debe tener instalado Access 2007/2010 (o el tiempo de acceso de acceso gratuito al menos) o los controladores ACE específicos de Microsoft .

Con respecto a la bitness 32/64

Por el bien de su cordura, independientemente de su bitness OS, solo use Office y Access 32 bits. Incluso Microsoft no recomienda el uso de la versión de 64 bits, excepto si está presionando Excel hasta sus límites.

  • no puede mezclar Office 32 bits y aplicaciones de 64 bits
  • no puede instalar los controladores ACE de 32 bits y 64 bits en la misma máquina
  • Utilice la versión 2007 o 2010 de los controladores ACE, pero evite tener ambos instalados.
  • asegúrese de que su aplicación .Net esté compilada para el mismo bitness que el controlador Access / ACE instalado (por lo que debe compilar específicamente a x86 si sigue los consejos anteriores, ¡ no AnyCPU!).

Actuación

Puede obtener un rendimiento muy decente con una base de datos de Access si mantiene algunas reglas:

  • si es posible, mantenga la base de datos en la misma máquina que la aplicación que le escribirá (evite la ralentización de la red)

  • si su aplicación es la única que usa la base de datos, abra la base de datos en modo exclusivo en lugar del modo compartido:

    // Share Mode=16 - use if multiple users must have simultaneous access to the db string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Mode=16;Data Source=C:/.../RSLogixDB.accdb;user id=;password=;"; // Share Mode=12 - exclusive mode if only your app needs access to the db string constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Mode=12;Data Source=C:/.../RSLogixDB.accdb;user id=;password=;";

  • abra una conexión ficticia a la base de datos cuando se inicia su aplicación y manténgala abierta hasta que no necesite la base de datos (para comprimirla, por ejemplo, o cuando su aplicación se apaga).
    En realidad, se trata de una mejora de rendimiento muy importante: abrir una nueva conexión a una base de datos de Access es costoso porque el controlador necesita crear / destruir / actualizar el archivo .accdl lock.
    Si mantiene una conexión siempre abierta a la base de datos, acelerará en gran medida su lectura / escritura en ella. Para obtener más información sobre este tema, consulte este artículo:
    ¿Dónde está la agrupación de conexiones OLE DB?

De regreso a la tarea

La forma en que haría lo que intentas lograr:

  • Utilice Access para crear manualmente una base de datos simple RSLogixDB.accdb con la tabla que contendría los datos.
    Cree también una tabla dummy con poco o ningún dato. Lo usaremos para mantener la conexión abierta y evitar los problemas de rendimiento del archivo de bloqueo.

  • Si necesita volver a crear la base de datos todos los días desde cero, guarde una copia de esa base de datos original como plantilla, luego copie esa plantilla y complete la copia con los nuevos datos diarios.

  • Si eres el único usuario de la base de datos, ábrela en modo exclusivo.

  • Abra una conexión y lea datos de la tabla ficticia, pero no la cierre. Déjala abierta.

  • guardar datos en su tabla de datos durante todo el día

  • a medianoche, cierre la base de datos (cierre la tabla ficticia), asegúrese de que el archivo de bloqueo .accdl desapareció y luego comprima la base de datos.
    Reemplace la base de datos por la plantilla si necesita comenzar con un db vacío.
    También compactaría la base de datos para reducir su tamaño antes de comprimirla.

  • Si el rendimiento estándar del acceso a datos de ADO.Net es insuficiente para su caso, eche un vistazo al uso de las rutinas DAO nativas. Mira la respuesta a esta pregunta SO:
    Escribir una gran cantidad de registros (inserción masiva) para acceder en .NET / C #