Developer's Diary

10 noviembre, 2010

Tips – Conectar Paradox con .Net

Estos días en el trabajo me he encontrado con un pequeño obstáculo que me ha costado más de lo esperado superar. La conexión de una base de datos en Paradox.

(more…)

Paradox, para los jóvenes y no tan jóvenes. Es una base de datos relacional, de los tiempos en los que programar y tener un ordenador era solo para freaks. Inicialmente tenía el control Corel y posteriormente Borland, podeis encontrar más información aquí.

En estos tiempos que corren muchos sistemas se encuentran relacionados con bases de datos como Paradox, Dbase y llega el momento de actualizarse y poder usarlo en sistemas más recientes. Ya había tratado anteriormente con base de datos de tipo DBase y no tuve ningún problema. Pero nunca lo había hecho con las Paradox.

Empecemos desde el principio, normalmente este tipo de bases de datos, se encuentran almacenadas en dos ficheros. Uno de tipo .db y .mdb. El primero, más pequeño es el encargado de archivar la estructuración de nuestra base de datos, mientras que el segundo es donde se almacenan estos, por lo que requerimos de ambos para poder tener acceso a la misma.

Iniclamente y en teoría, aplicaciones como Excel o Access tienen soporte para este tipo de base de datos y pueden abrirse y leerse con estos. Sin embargo, cuando intentamos abrirlos nos encontramos errores como los siguientes:

ERROR [IM002] [Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado

o este otro

El motor de base de datos Microsoft Jet no pudo encontrar el objeto NOMBREDEOBJETO. Asegurese de que el objeto existe, y que ha escrito el nombre y la ruta de acceso al objeto correctamente

Estos errores se deben a que intentamos abrir nuestra base de datos con drivers de conexión como son Odbc o Oledb. Sin embargo, el driver que tenemos instalado para la apertura de estos datos no termina de ser el correcto.

Como primer intento cuando intentamos acceder a estas bases de datos, podemos comenzando a probar cada una de las connectionstring comunes para intentar abrir la base de datos. Un lugar muy bueno para poder localizarlas es este. Esta página es una de las principales herramientas que debeis tener en cuenta cuando useis bases de datos, sin duda alguna.

 

Si después de probar cada una de las cadenas de conexión, no obteneis resultados, como me ocurrió a mí. Podeis pasar al plan B. Obtener un nuevo driver para poder conectar.

 

El soporte de los drivers propios de Borland actualmente es casi imposible, si teneis una copia de alguna versión de Delphi, podreis localizar lo que queremos, en caso contrario dejo el enlace aquí. Creo que no violo ningún derecho de Copyright, lo podeis descargar de aquí.

 

Tras tener estos driver, debemos instalarlo, esto nos generará una carpeta que por defecto se localizará en C:\Archivos de programa\Archivos comunes\Borland Shared\BDE. Desde ahí tendremos un ejecutable llamado BDEAdministrator, debemos abrirlo y realizar los siguientes pasos:

 

– Instalamos el ejecutable.

– Ejecutamos el BDEAdministrator.

– Creamos una carpeta, esa carpeta será donde debemos ubicar los archivos de la base de datos, en el caso de ejemplo crearemos ParadoxDB en C:\ y dentro otra carpeta llamada LockFiles

– Desde BDEAdministrator vamos a la pestaña Configuration / Drivers / Native / Paradox. En la propiedad Net Dir ponemos la ubicación de la carpeta que hemos creado anteriormente.

– Nos dirigimos a la opción object y marcamos la opción apply para realizar los cambios.

– Copiamos nuestros archivos de datos a la carpeta que hemos seleccionado.

 

 

Ya tenemos nuestros datos ubicados, podemos cerrar la aplicación de BDEAdministrator. Ahora pasamos a la fase 2. Usar nuestros datos de Paradox desde C#. Podemos consumirlo igual que cualquier otra base de datos. Voy a poner un ejemplo de como lo consumiríamos desde C# y pasaramos los datos a un DataGridView, normal.

 

Este sería el snippet.

 

OleDbConnection _connection = new OleDbConnection();
StringBuilder ConnectionString = new StringBuilder(“”);
ConnectionString.Append(@”Provider=Microsoft.Jet.OLEDB.4.0;”);
ConnectionString.Append(@”Extended Properties=Paradox 5.x;”);
ConnectionString.Append(@”Data Source=C:\PARADOXDB\;”);
_connection.ConnectionString = ConnectionString.ToString();
_connection.Open();

OleDbCommand com = new OleDbCommand();
com.Connection = _connection;
com.CommandText = “SELECT * FROM Clientes;”;
OleDbDataAdapter da = new OleDbDataAdapter(com);
DataSet dsRetrievedData = new DataSet();
da.Fill(dsRetrievedData);
this.dataGridView1.DataSource = dsRetrievedData;
this.dataGridView1.DataMember = dsRetrievedData.Tables[0].TableName;

 

En caso de que modifiquemos la ubicación de la carpeta, deberíamos cambiar el connectionstring en el apartado de Data Source y elegir la ubicación que usemos.

 

Además, de poder usar estas bases de datos desde C# también podremos comenzar a usarlas desde nuestras aplicaciones office. Mostrándose como una tabla convencional.

 

Hasta aquí el Tip de hoy, espero que os sea de ayuda y no perdais un tiempo valioso en buscar la solución, como a mi me ha ocurrido.

 

Saludos!

 

 

He editado este post, porque me pedían que subiera de nuevo el enlace, en este caso lo he subido dos veces.

Se encuentra aquí:

http://www.4shared.com/rar/lmrBIMns/bde52.html

Y aquí:

http://www.mediafire.com/?249dphhvpbc12bz

Perdonar por el retraso a las personas que lo estaban buscando.

Anuncios

22 comentarios »

  1. Genial… aunque yo estoy manejando Visual Basic.Net y tendre que traducir el codigo, oye y ese codigo lo pones en el form? o donde espero puedas ayudarme…

    Gracias

    Comentario por Blanca — 29 marzo, 2011 @ 9:31 PM

    • Gracias.
      No hay problema para traducir el código, ya verás. Donde pones ese código. Dependiendo de como quieras ejecutar la aplicación. Lo puedes dejar en el form y llamarlo desde un método o si lo prefieres puedes crearte una clase con ese código, esa clase la preparas para conectar con Paradox. Yo te recomiendo esta segunda opción básicamente, si después vas a usar ese código en otro formulario o en otra aplicación, solo reutilizar esa clase que te creaste previamente.

      Si te surge alguna duda más, no dudes en comentar.

      Saludos.

      Comentario por 3nk1 — 30 marzo, 2011 @ 12:45 PM

      • Hola gracias por tu pronta respuesta, y si al final hice eso, lo coloque en una clase y luego cree la instancia, pero tengo una nueva inquietud, aunque creo que me salgo un poco del tema aqui presentado, y es si sabras la manera en que pudiera respaldar alguna de mis tablas paradox a sql…

        De nuevo Gracias

        Comentario por Blanca — 30 marzo, 2011 @ 7:11 PM

      • Te sales un poco, pero para eso estamos. La verdad, es que inicialmente no sé si existe una aplicación que pueda hacerte ese respaldo. Pero puedes crearla tu misma, realizando la conexión con la base de datos. Puedes solicitar el Schema de esa base de datos. Creo que ese método se encuentra en la OleDBConection, de esa manera tienes tablas y atributos, etc.
        Con varias consultas a esas tablas, podrías tener los datos de las mismas y desde ahí generar tu propio SQL. Puede resultar una aplicación algo complicada, pero si vas a tener que hacerlo en varias ocasiones.

        Si lo que realmente que quieres son los datos, puedes realizar un SELECT sobre cada una de las tablas, introducir esos datos en un DATASET y crear tus propios ficheros de SQL, que finalmente son texto plano. Esta segunda opción pienso que no es tan complicada.

        No sé si sabes exactamente a lo que me refiero, pero si necesitas más información no dudes en comentar de nuevo o si quieres esperar, ya que estamos haciendo un apartado del curso de C# de como usar BBDD.

        Un saludo.

        Comentario por 3nk1 — 30 marzo, 2011 @ 8:05 PM

  2. =) Gracias me has dado una nueva idea de como resolver mi problema, y claro tambien checare la informacion que me comentas en el momento que la publiquen…

    Saludos

    Comentario por Blanca — 30 marzo, 2011 @ 10:03 PM

    • Me alegro de que te haya sido de utilidad. No dudes en continuar pasandote por aquí.

      Saludos

      Comentario por 3nk1 — 30 marzo, 2011 @ 10:27 PM

  3. hola:

    oye se ve genial pero logicamente ya no funciona el link :S existira algun otro lugar donde conseguirla??? 😀

    Comentario por David Eduardo Domninguez Escutia — 21 mayo, 2012 @ 2:50 PM

    • Ya puse el link David, perdona por el retraso.

      Un saludo.

      Comentario por 3nk1 — 21 junio, 2012 @ 7:29 AM

  4. Estoy tratando de completar este codigo para hacer la conexion por Odbc pero me lanza el mismo error que presentas arriba: ERROR [IM002] [Microsoft][Administrador de controladores ODBC] ya me duelen los ojos de tanto buscar en internet me ayudarias a completar el codigo para hacer la conexion estoy usando paradox 9

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.Odbc;
    using System.Data;

    namespace DMLSQLProject
    {

    class DataAccess
    {
    // declaramos una variables de tipo odbc conection que se utiliza para hacer la coneccion con la base de datos
    // la establecemos publica por que asi tendremos acceso a ella desde todo el formulario

    public OdbcConnection con = new OdbcConnection(“Dsn=Paradox; paradox 7.x; uid=Dureza”);

    public void ConsultaBasica()
    //esta funcion se encarga de hacer una consulta y estraer los datos
    {
    FormConsultarDatos form = new FormConsultarDatos();

    try
    {
    DataSet ds = new DataSet();
    OdbcCommand cmd = new OdbcCommand(“SELECT * FROM TABLA”, con);
    con.Open();
    OdbcDataAdapter da = new OdbcDataAdapter(cmd);
    con.Close();
    da.Fill(ds, “descripcion”);
    form.dgvconsulta.DataSource = ds.Tables;
    form.lblguardar.Text = “Error “;

    }
    catch (OdbcException e)
    {
    form.lblguardar.Text = “Error ” + e.Message;
    con.Close();

    }

    }
    }
    }

    Comentario por Yaret — 21 abril, 2013 @ 5:51 AM

    • Buenas Yaret, Así a bote pronto no sabría decirte que puede ser lo que está ocurriendo. ¿Instalaste los drivers que indico en el post?. Creo recordar que el error que comentas era por eso, por los drivers.

      ¿El bdeAdminsitrator te reconoce la base de datos?

      Un saludo y espero que encontremos la solución. 🙂

      Comentario por 3nk1 — 21 abril, 2013 @ 1:35 PM

      • Tengo paradox 9 edicion develop y por defecto me trae los driver que son: INTERSOLV 3.11 32-BIT ParadoxFi y trae tambien el DBE administrator 5.01 ese mismo que das para descargar y por nada quiere por mas que configuro los driver y muevo cosas y pongo cosas que encuentro por internet el mismo error una y otra vez me revisarias el codigo a ver si tengo algun error please.

        Comentario por Yaret — 22 abril, 2013 @ 12:24 AM

  5. Acepto cualquier sugerencia para modificar mi codigo, el driver supuestamente habre tablas de paradox desde el 1 hasta el 7

    Comentario por Yaret — 22 abril, 2013 @ 12:51 AM

  6. Si justamente al abrir la conexion me presenta el dialogo: ERROR [IM002] [Microsoft][Administrador de controladores ODBC]

    Comentario por Yaret — 22 abril, 2013 @ 2:20 PM

    • Prueba a jugar con la cadena de conexión que te he facilitado. Al tener instalado los intersolv, la cadena de conexión es completamente distinta a la que planteas en los comentarios y que planteaba yo en la entrada.

      Comentario por 3nk1 — 22 abril, 2013 @ 2:28 PM

      • Gracias por ayudarme. si ya solucione logre conectar paradox 9.xD Edita, borra y busca, esta es la solucion por medio de oldb,
        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        using System.Data.OleDb;

        namespace prueba
        {
        public partial class Form1 : Form
        {
        public Form1()
        {
        InitializeComponent();
        }
        //creamos dos variables de coneccion
        OleDbConnection con = new OleDbConnection();

        private void conectar()
        {
        //creamos un string builder que es lo mejor para concaternar osea unir
        StringBuilder ConnectionString = new StringBuilder();
        //la funcion conectar crea la coneccion a la base de datos
        ConnectionString.Append(@”Provider=Microsoft.Jet.OLEDB.4.0;”);
        ConnectionString.Append(@”Extended Properties=Paradox 5.x;MODE=readwrite;”);
        ConnectionString.Append(@”Data Source=C:\bd\;”);
        con.ConnectionString = ConnectionString.ToString();
        }

        private void buscar(string text)
        {
        //creamos una funcion buscar para buscar los datos
        //cramos la variable que tendra la consulta
        string cadena;

        //chequeamos la variable que resive el programa
        if (text == “”)
        {
        limpiar();
        }

        else
        {

        if (text == “todos”)
        {
        //si la variable es igual all estrae todos los datos bdparadox
        cadena = “SELECT * FROM DBparadox;”;
        }
        else
        {

        //ara una busqueda con los nombred que empiesen con la variable
        cadena = “SELECT * FROM DBparadox Where Nombre Like ‘” + text + “%’;”;

        }

        try
        //usamos un try para detectar si algo esta saliendo mal y que no nos esplote el programa
        {
        //creamos un dataset para guardar los datos
        DataSet datos = new DataSet();
        //creamos el comando con la consulta
        OleDbCommand com = new OleDbCommand(cadena, con);
        //abrimos la coneccion
        con.Open();
        //guardamos la consulta ya echa en un dataadapter
        OleDbDataAdapter da = new OleDbDataAdapter(com);
        da.Fill(datos);
        //llenamos el dataset con la informacion de la consulta
        this.dataGridView1.DataSource = datos;
        this.dataGridView1.DataMember = datos.Tables[0].TableName;
        //mostramos los datos del dataset en el datagridview
        con.Close();
        //cerramos la coneccion
        }
        catch (OleDbException ex)
        {//si se produjera algun error relacionado con la consulta el catch seria la parte del try que atrapa el error

        con.Close();
        //cerramos la coneccion si se produjo algun error es muy buena cerrarle antes de alser algo
        MessageBox.Show(ex.Message, “Error”);
        //en un mensaje mostramos el error que causo el programa
        }

        }

        }

        private void insertar()
        {
        try
        {
        //creamos el comand para insertar los datos

        OleDbCommand com = new OleDbCommand(“insert into DBparadox (Nombre,Apellido,Direccion,Telefono) Values (‘” + txtnombre.Text + “‘,'” + txtapellido.Text + “‘,'” + txtdireccion.Text + “‘,'” + txttelefono.Text + “‘)”, con);

        //abrimos la coneccion
        con.Open();
        //ejecutamos la instruccion del comando en la bd
        com.ExecuteNonQuery();
        //y cerramos la coneccion a la base de datos
        con.Close();
        //si se gualda en la etiqueta status aparece guardado
        lblstatus.Text = “Guardado”;
        }
        catch (OleDbException ex)
        {
        //con el catch aparamos el error
        con.Close();
        //cerramos la coneccion a la base de datos
        lblstatus.Text = “No Guardado”;
        // la etiqueta status mostra que no se gualdo
        MessageBox.Show(ex.Message, “Error”);
        // y aparecera un mensaje mostrando el error

        }
        }

        private void limpiar()
        {
        //funcion para limpiar del boton limpiar
        txtguardar.Text = “”;
        //limpiamos el cuadro de texto
        dataGridView1.Columns.Clear();
        //limpiamos el datagridview
        txtguardar.Focus();
        // dejamos el focus en el cuadro de texto
        }

        private void chek()
        {

        if (txtnombre.Text == “” || txtapellido.Text == “” || txtdireccion.Text == “” || txttelefono.Text == “”)
        {//comprobamos uno por uno si los espacios estan vacio y si lo estan muestra el error
        MessageBox.Show(“No puede haber ningun campo vacio para guardar”, “Llenar todos los campos”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        else { insertar(); }

        }

        private DataTable datos()
        {

        string cadena;
        cadena = “SELECT ID,Nombre FROM DBparadox ;”;
        OleDbCommand com = new OleDbCommand(cadena, con);
        DataTable datos = new DataTable(“ID”);
        //abrimos la coneccion
        con.Open();
        //guardamos la consulta ya echa en un dataadapter
        OleDbDataAdapter da = new OleDbDataAdapter(com);
        da.Fill(datos);
        con.Close();
        return datos;

        }

        private void borrar() {

        OleDbCommand com = new OleDbCommand(“delete From DBparadox where ID = “+comboBox1.Text+””, con);
        try{
        //abrimos la coneccion
        con.Open();
        //ejecutamos la instruccion del comando en la bd
        com.ExecuteNonQuery();
        //y cerramos la coneccion a la base de datos
        con.Close();

        MessageBox.Show(“Se a borrado con exito el registo numero “+comboBox1.Text,”borrado con exito” );
        comboBox1.DataSource = datos();
        comboBox1.DisplayMember = “Productos”;
        comboBox1.ValueMember = “ID”;
        }
        catch (OleDbException ex) {
        MessageBox.Show(ex.Message,”error”);

        }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
        conectar();
        comboBox1.DataSource = datos();
        comboBox1.DisplayMember = “Productos”;
        comboBox1.ValueMember = “ID”;

        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {//ejectamos el metodo limpiar en el boton limpiar
        limpiar();
        }

        private void txtguardar_TextChanged(object sender, EventArgs e)
        {//usamos la propiedad del cuandro de texto cuando el texto cambia para asi ver algo cada ves que escribamos una letra

        //y le damos al metodo buscar el contenido del cuandro de texto
        buscar(txtguardar.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        { //en el boton guardar ejecutamos el metodo insertar
        //aunque por el driver no me deja hacer en la bd ni update,insert,delete nada que acualize la bd
        chek();
        comboBox1.DataSource = datos();
        comboBox1.DisplayMember = “Productos”;
        comboBox1.ValueMember = “ID”;
        }

        private void pageborrar_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
        borrar();
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
        }
        }

        Comentario por Yaret — 24 abril, 2013 @ 7:49 PM

  7. ConnectionString.Append(@”Data Source=C:\bd\;”); aqui cambias la base de datos
    y usando el Borland Database Engine 5.01 configuras en driver, native, paradox, net dir: pones la direccion de la base de datos nuevamente y listo tienes paradox y visual funcionando juntos.

    Comentario por Yaret — 24 abril, 2013 @ 7:53 PM

  8. cadena = “SELECT * FROM DBparadox;”; Esta es la tabla a la que afecta, en dado caso de cambiar la tabla por otra.

    Comentario por Yaret — 24 abril, 2013 @ 8:00 PM

    • Muchisimas gracias por tu respuesta Yaret. Me alegro muchisimo que hayamos podido ayudarte en todo lo posible. Si me lo permites, edito el post y añado tus comentarios.

      Un saludo!

      Comentario por 3nk1 — 24 abril, 2013 @ 9:48 PM

      • Tambien otra sigerencia alparecer windows 7 por hacernos la vida mas facil aveces no las dificulta 😀 el dbe da un error si no lo habrimos por administrador por ejemplo si abres al dbe sin administrador te sale como que es la version 4.0 y la aplicacion te muestra este error: Unexpected error from external database driver (11265) pero si abres la dbe como administrador te sale 5.0 y el programa funciona bien listo. Claro q puedes porque informacion para conectar pardox con net no aparecen mucha en google.

        Comentario por yaret — 25 abril, 2013 @ 6:58 PM

  9. Yaret como puedo comunicarme contigo… necesito tu ayuda para crear un formulario en c sharp y conectarlo con una base de datos PARADOX. tengo windows 8.1 instalado en mi maquina.

    Comentario por EdwardPuello — 23 mayo, 2014 @ 2:06 PM

  10. Hola se que este post ya es algo viejo pero tengo un problema que no encuentro como soluciarlo y espero me ayuden. Tengo un Web service en C# que hace una consulta a mi base en paradox y localmente si funciona bien, pero al publicarlo en un servidor IIS 7 no me conecta y me arroja bastantes errores y la verdad he investigado porque pasa esto pero no hay mucha información en la red. Espero me puedan ayudar

    Gracias

    Comentario por Robert — 3 junio, 2014 @ 5:02 PM


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: