none
Realizar SQL para un archivo en EXCEL RRS feed

  • Pregunta

  • Cordial saludo comunidad:D

     

    Mi inquietud es la siguiente... yo me conecto por medio de OleDb a un archivo en excel como si fuera una base de datos...

    ya se como cargar el archivo de excel y crear la conexion lo que quiero es ya cargado este archivo buscar dentro de el... voy a colocar el codigo para que me entiendan mejor...

     

    OpenFileDialog respuesta = new OpenFileDialog();
                String strConString = "";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                   

                        FileInfo f = new FileInfo(openFileDialog1.FileName);

                        DataSet objDataset1 = new DataSet();
                        string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + openFileDialog1.FileName + ";Extended Properties=Excel 8.0;";
                        OleDbConnection objConn = new OleDbConnection(ConnectionString);
                        objConn.Open();


                        strConString = "SELECT * from [Hoja1$]";

     

                        OleDbCommand objCmdSelect = new OleDbCommand(strConString, objConn);
                        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
                        objAdapter1.SelectCommand = objCmdSelect;
                        DataTable dt = new DataTable();
                        objAdapter1.Fill(objDataset1, "ExcelData");
                        objConn.Close();
                        //gvImportar.DataSource = objDataset1.Tables[0];
                        dt = objDataset1.Tables[0];//.Copy();
                        dataGridView1.DataSource = dt;

     

     

    En esta parte me imagino que puedo hacer un sql que me busque en mi archivo un determinado dato

    strConString = "SELECT * from [Hoja1$] "; LO hice de la siguiente manera pero me marca error de que la clausula no es compatible

    strConString = "SELECT * from [Hoja1$] WHERE CEDULA=' "+ 1010 +" ' "; una de mis columnas es CEDULA por eso pienso que solo me traiga todo donde la cedula sea igual a 1010

     

    Estoy trabajando con C#

     

    Espero que me halla hecho entender de antemano muchas gracias si me ayudan

    miércoles, 31 de marzo de 2010 17:00

Respuestas

  • hola

    mira este link

    Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

    veras que para usar los nombres de las columnas del excel en la query deberias definir en la primer fila del mismo el nombre de esa columna

    por ahi este es el problema con la consulta

     

    mas alla de eso, tambien podrias cargar todo el excel al dataset y usar LinQ para filtrar los datos, si estas usando VS2008 y .net 3.5 podruas usarlo y filtrar los datos de dataset, que por supuesto estara cargado completo con los datos del excel

    LINQ to DataSet

    LINQ to DataSet Samples

     

    otra alternativa es que use el metodo Select del Datatable


    por supuesto en estos dos ultimos casos usarias la consulta SELECT * from [Hoja1$]
    para cargar todo el excel, y filtrarias en memoria directo sobre el dataset

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta alejandro6544 lunes, 5 de abril de 2010 19:02
    jueves, 1 de abril de 2010 4:36
  • > strConString = "SELECT * from [Hoja1$] WHERE CEDULA=' "+ 1010 +" ' ";

    No observo nada rado en la consulta SQL de selección que intentas ejecutar, para que te indique que la cláusula no es compatible. ¿?

    Lo único que te diría es que elimases LOS ESPACIOS EN BLANCO existentes entre las comillas simples y las dobles comillas:

          strConString = "SELECT * from [Hoja1$] WHERE CEDULA='" + 1010 +"'";

    Te lo digo porque al ser un tipo alfanumérico, una cosa es el valor " 1010 " (con espacios en blanco), y otra muy distinta el valor "1000" (sin espacios en blanco).

    Aprovecho el mensaje para indicarte que se puede abreviar el código fuente para rellenar un objeto DataTable de la siguiente manera:

                using (OleDbConnection cnn = new OleDbConnection())
                {
                    try
                    {
                        // Construimos la cadena de conexión
                        cnn.ConnectionString =
                            @"Data Source=C:\Mis documentos\Libro1.xls;" +
                            "Provider=Microsoft.Jet.OLEDB.4.0;" +
                            "Extended Properties='Excel 8.0;'";

                        // Construimos la consulta SQL de selección
                        string sql = "SELECT * from [Hoja1$] WHERE CEDULA='" + 1010 + "'";

                        // Creamos el adaptador de datos
                        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(sql, cnn);

                        // Creamos el objeto DataTable
                        DataTable dt = new DataTable("ExcelData");

                        // Rellenamos el objeto DataTable
                        objAdapter1.Fill(dt);

                        // Asignamos el origen de datos al control DataGridView
                        dataGridView1.DataSource = dt;

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }

    Adapta el ejemplo a tus necesidades.

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    jueves, 1 de abril de 2010 10:39

Todas las respuestas

  • hola

    mira este link

    Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

    veras que para usar los nombres de las columnas del excel en la query deberias definir en la primer fila del mismo el nombre de esa columna

    por ahi este es el problema con la consulta

     

    mas alla de eso, tambien podrias cargar todo el excel al dataset y usar LinQ para filtrar los datos, si estas usando VS2008 y .net 3.5 podruas usarlo y filtrar los datos de dataset, que por supuesto estara cargado completo con los datos del excel

    LINQ to DataSet

    LINQ to DataSet Samples

     

    otra alternativa es que use el metodo Select del Datatable


    por supuesto en estos dos ultimos casos usarias la consulta SELECT * from [Hoja1$]
    para cargar todo el excel, y filtrarias en memoria directo sobre el dataset

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta alejandro6544 lunes, 5 de abril de 2010 19:02
    jueves, 1 de abril de 2010 4:36
  • > strConString = "SELECT * from [Hoja1$] WHERE CEDULA=' "+ 1010 +" ' ";

    No observo nada rado en la consulta SQL de selección que intentas ejecutar, para que te indique que la cláusula no es compatible. ¿?

    Lo único que te diría es que elimases LOS ESPACIOS EN BLANCO existentes entre las comillas simples y las dobles comillas:

          strConString = "SELECT * from [Hoja1$] WHERE CEDULA='" + 1010 +"'";

    Te lo digo porque al ser un tipo alfanumérico, una cosa es el valor " 1010 " (con espacios en blanco), y otra muy distinta el valor "1000" (sin espacios en blanco).

    Aprovecho el mensaje para indicarte que se puede abreviar el código fuente para rellenar un objeto DataTable de la siguiente manera:

                using (OleDbConnection cnn = new OleDbConnection())
                {
                    try
                    {
                        // Construimos la cadena de conexión
                        cnn.ConnectionString =
                            @"Data Source=C:\Mis documentos\Libro1.xls;" +
                            "Provider=Microsoft.Jet.OLEDB.4.0;" +
                            "Extended Properties='Excel 8.0;'";

                        // Construimos la consulta SQL de selección
                        string sql = "SELECT * from [Hoja1$] WHERE CEDULA='" + 1010 + "'";

                        // Creamos el adaptador de datos
                        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(sql, cnn);

                        // Creamos el objeto DataTable
                        DataTable dt = new DataTable("ExcelData");

                        // Rellenamos el objeto DataTable
                        objAdapter1.Fill(dt);

                        // Asignamos el origen de datos al control DataGridView
                        dataGridView1.DataSource = dt;

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }

    Adapta el ejemplo a tus necesidades.

    Un saludo

     


    Enrique Martínez [MS MVP - VB]
    jueves, 1 de abril de 2010 10:39
  • Cordial saludo SoftJaén

     

    Me funciona pero cuando se escribe la consulta string sql = "SELECT * from [Hoja1$] WHERE CEDULA='" + 1010 + "'";

    no se debe colocar entre comillas simples solo comillas dobles

    string sql = "SELECT * from [Hoja1$] WHERE CEDULA="+1010+"";

    De verdad muchas gracias por sus ayudas me han servido mucho

    lunes, 5 de abril de 2010 15:59
  • No entiendo tu afirmación.

    Si el campo CEDULA es alfanumérico, los valores los tienes que encerrar entre comillas simples. Pero si el campo es de algún tipo numérico, entonces no tienes que encerrarlos entre comillas, ni simples ni dobles. :-)

     


    Enrique Martínez [MS MVP - VB]
    lunes, 5 de abril de 2010 16:56