none
¿cual es la sintaxis para realizar consultas sobre excel? (usando OleDbConnection) RRS feed

  • Pregunta

  • Hola, pues es que intento buscar ejemplos pero siempre encuentro lo mismo. Hasta ahora había utilizado este código para leer un excel:

    string strConnnectionOle = @"Provider=Microsoft.Jet.OLEDB.4.0 ;" + @"Data Source=" + textBoxFichero.Text + ";" + @"Extended Properties=" + '"' + "Excel 8.0;HDR=NO" + '"';
    string sqlExcel = "Select * From [NombreHojaExcel$]";
    DataTable DS = new DataTable();
    OleDbConnection oledbConn = new OleDbConnection(strConnnectionOle);
    oledbConn.Open();
    OleDbCommand oledbCmd = new OleDbCommand(sqlExcel, oledbConn);
    OleDbDataAdapter da = new OleDbDataAdapter(oledbCmd);
    da.Fill(DS);
    int i = 0;
    foreach (DataRow fila in DS.Rows)
    {
       //uso de los datos leidos
    }

    y la verdad es que muy bien. Pero ahora tengo la necesidad de hacer varias cosas sobre los datos, y básicamente por eficiencia, necesito que en lugar de hacer un select * hacer un select distinct de una columna concreta.

    Tengo dos problemas, el primero, que no sé qué sintaxis es la correcta, siempre he usado select * y las veces que he probado hacer otras cosas como no me salía al final me he traido todos los datos y luego he trapicheado con lo obtenido xD.

    Y el segundo problema, es que como no sé la sintaxis, pues no sé si es problema de eso o es que directamente no se puede, y es que el excel tiene las dos primeras filas como cabeceras, y no solo la primera, algo tipo

    --------datos documento--------- | ------datos persona---------

    --id--nombre--otros campos---  | --dni--nombre--apellidos---

    No sé si me explico. Básicamente mi duda es (porque a unas malas le borro al excel la primera fila y ya está) ¿cómo podría acceder a una columna concreta y hacer distinct y demás consultas sql?

    Un saludo y muchas gracias de antemano.

    EDIT: se supone que así debería funcionar?

    SELECT [Column Name One], [Column Name Two] FROM [Sheet One$]

    porque no lo hace...xD ({"No se han especificado valores para algunos de los parámetros requeridos."}) A ver si soy capaz de hacer consultar con where y demás...saludos.


    • Editado fjbgcmbsgr miércoles, 25 de abril de 2012 9:40
    miércoles, 25 de abril de 2012 7:59

Respuestas

  • uniendo varias hojas de excel, con JOINs, y varias condiciones en el WHERE

    porque no usas linq

    [ADO.NET] Excel y Linq (Union)

    no digo que lo realices tal cual en el articulo, pero si podrias ser una base para que veas que no todo lo tienes que resolver desde la query de sql al excel

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 25 de abril de 2012 17:35

Todas las respuestas

  • siempre he usado select * y las veces que he probado hacer otras cosas como no me salía al final me he traido todos los datos y luego he trapicheado con lo obtenido

    que es " trapicheado" ? esta poco claro esto que planteas

    pues no sé si es problema de eso o es que directamente no se puede, y es que el excel tiene las dos primeras filas como cabeceras, y no solo la primera, algo tipo

    si revisas el connection string

    http://www.connectionstrings.com/excel

    veras que si defines el

    "HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 25 de abril de 2012 13:01
  • Hola, en primer lugar, gracias por responder.

    En segundo lugar, lo de "trapichear" me refiero a que en lugar de consultar con un select con una clausula where y traerme a lo mejor los cuatro o cinco registros que quiero, como daba fallos por todos lados, y era una cosa "sin importancia", pues hacía un select * y luego ya cuando tenía todo en el datatable pues lo recorría y me quedaba con los cuatro datos que me interesaban.

    La cuestión es que ahora tengo que hacer una consulta algo más "compleja" (uniendo varias hojas de excel, con JOINs, y varias condiciones en el WHERE) y la verdad es que no sé que sintaxis tiene que tener la consulta para que funcione.

    En otras palabras, si la consulta fuera sobre tablas de una base de datos, no habría problema, puesto que haría mi consulta en sql tan normal y ya está. El problema que se me presenta es que no sé cómo acceder a las diferentes columanas (cómo digo las dos primeras filas son de columnas, por lo que hasta ahora cogía y al recorrer el datetable empezaba en la fila tres, y accedia a los campos en función de su orden (fila[0], fila[9], etc.)) ni sé como agregar condiciones al where y demás.

    Por eso pido consejo por si existe algún manual de cómo realizar consultas sobre excel, ya que no sé si es problema de sintaxis o del excel o que pasa...probaré sino a crearme un excel pequeño de prueba con pocas columnas y pocos datos y a ver si consigo hacerlo funcionar.

    Como siempre, muchas gracias por todo.

    Un saludo.

    miércoles, 25 de abril de 2012 17:09
  • uniendo varias hojas de excel, con JOINs, y varias condiciones en el WHERE

    porque no usas linq

    [ADO.NET] Excel y Linq (Union)

    no digo que lo realices tal cual en el articulo, pero si podrias ser una base para que veas que no todo lo tienes que resolver desde la query de sql al excel

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 25 de abril de 2012 17:35
  • muchas gracias, voy a investigar esto del linq que parece interesante :D
    jueves, 26 de abril de 2012 7:57