none
IMPORTAR ARCHIVO CSV COMO TABLA EN SQL SERVER RRS feed

  • Pregunta

  • Hola !! estoy aprendiendo visual studio ! y me pidieron una pequeña aplicacion que seleccione desde una ubicacion un archivo csv, una vez seleccionado se requiere mandarlo a sql  server como tabla dentro de una base de datos, lo puedo hacer sin problema via tarea, importar x,y,z dentro de sql, lo que deseo es mandarlo directamente a sql y que se anide en la base de datos x, el csv nunca sera del mismo tamaño me refiero que puede contener 5 columnas o 50, y registros tambien seran muy variables,asi que solo deseo que se pueda importar directo desde visual studio 2013 a traves de codigo, a sql server, ojala alguien pudiera ayudarme gracias
    martes, 21 de mayo de 2019 14:20

Respuestas

  • Hay que descomponer el problema en dos partes:

    1) Leer el CSV a una estructura en memoria tal como un DataTable.

    2) Grabar el datatable sobre una tabla de SQL Server.

    La primera parte es fácil si el CSV es trivial (usar StreamReader y Split), pero se puede complicar mucho si el CSV contiene cosas como campos que dentro del campo contienen el delimitador de campos (debidamente escapado), o saltos de línea dentro de campos delimitados, etc. En estos casos, es preferible usar alguna librería ya existente que tenga resueltas esas peculiaridades.

    Una vez que tengas los datos cargados en memoria, hay que volcarlos al SQL Server. Si están guardados en un DataTable, basta con usar un SqlDataAdapter bien configurado para que la salve con solo llamar a su método Update. Si necesitas mayor velocidad (muchos miles de registros) puedes usar la clase SqlBulkCopy. En ambs casos, se presume que la tabla ya existe en el servidor y que los nombres de las columnas coinciden con los que tienes en el DataTable. Si no es así, y hay que crear la tabla, puedes hacerlo transmitiendo una sentencia "create table" al servidor mediante un SqlCommand y el método ExecuteNonQuery... pero esto requiere construir dicha sentencia por programacion, lo cual a su vez requiere inferir los tipos de los campos, cosa que puede no ser nada sencilla porque en el CSV no están definidos, así que hay que aplicar alguna heurística para lograrlo.

    Como ves, se pueden complicar las cosas bastante dependiendo de qué sea lo que tengas o no tengas que soportar. Un importador universal que haga "de todo" tendrá una complejidad considerable (posiblemente miles de líneas de código), así que no es probable que alguien te lo escriba entero en el foro. En cambio, no habrá problema en responder preguntas pequeñas tales como "cómo usar Split para trocear una línea del CSV en un caso sencillo" o "cómo uso un SqlBulkCopy para volcar un datatable a una tabla a creada con las mismas columnas". No es demasiado difícil encontrar ejemplos en la red. Por ejemplo, aquí hay uno:

    https://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/

    • Marcado como respuesta hecero jueves, 23 de mayo de 2019 2:28
    martes, 21 de mayo de 2019 14:54
  • Muchisimas gracias por el apoyo !! realmente es muy interesante, ya que como les comento estoy iniciando y pues me cuesta un poco poder entender esta nueva programacion, pero verdaderamente lo agradezco y como lo menciono en un inicio, si hago una importacion mediante el icono de importar exportar datos, pues me resulta muy sencillo pasa derechito, ya que el archivo csv esta perfectamente bien delimitado y no me importa ahi si contiene 10 o 100 columnas el sql import export lo lee de la ubicacion donde se le indico que estaba el archivo y zaz hace la importacion derechita, que es lo que yo pretendo hacer via programacion, de todas formas en verdad agradezco a ustedes,,,,disculapas para ambas personas que me auxiliaron en este tema pero no estoy seguro cual es su nombre, espero sea Alberto y eRiver1, gracias son ustedes muy profesionales y muy amables. gracias de nuevo
    • Marcado como respuesta hecero jueves, 23 de mayo de 2019 2:28
    jueves, 23 de mayo de 2019 2:28

Todas las respuestas

  • Hay que descomponer el problema en dos partes:

    1) Leer el CSV a una estructura en memoria tal como un DataTable.

    2) Grabar el datatable sobre una tabla de SQL Server.

    La primera parte es fácil si el CSV es trivial (usar StreamReader y Split), pero se puede complicar mucho si el CSV contiene cosas como campos que dentro del campo contienen el delimitador de campos (debidamente escapado), o saltos de línea dentro de campos delimitados, etc. En estos casos, es preferible usar alguna librería ya existente que tenga resueltas esas peculiaridades.

    Una vez que tengas los datos cargados en memoria, hay que volcarlos al SQL Server. Si están guardados en un DataTable, basta con usar un SqlDataAdapter bien configurado para que la salve con solo llamar a su método Update. Si necesitas mayor velocidad (muchos miles de registros) puedes usar la clase SqlBulkCopy. En ambs casos, se presume que la tabla ya existe en el servidor y que los nombres de las columnas coinciden con los que tienes en el DataTable. Si no es así, y hay que crear la tabla, puedes hacerlo transmitiendo una sentencia "create table" al servidor mediante un SqlCommand y el método ExecuteNonQuery... pero esto requiere construir dicha sentencia por programacion, lo cual a su vez requiere inferir los tipos de los campos, cosa que puede no ser nada sencilla porque en el CSV no están definidos, así que hay que aplicar alguna heurística para lograrlo.

    Como ves, se pueden complicar las cosas bastante dependiendo de qué sea lo que tengas o no tengas que soportar. Un importador universal que haga "de todo" tendrá una complejidad considerable (posiblemente miles de líneas de código), así que no es probable que alguien te lo escriba entero en el foro. En cambio, no habrá problema en responder preguntas pequeñas tales como "cómo usar Split para trocear una línea del CSV en un caso sencillo" o "cómo uso un SqlBulkCopy para volcar un datatable a una tabla a creada con las mismas columnas". No es demasiado difícil encontrar ejemplos en la red. Por ejemplo, aquí hay uno:

    https://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/

    • Marcado como respuesta hecero jueves, 23 de mayo de 2019 2:28
    martes, 21 de mayo de 2019 14:54
  • Hola hecero, 

    Siguiendo a lo que dice Alberto, realmente podrias solo guardar el nombre del csv o la ruta del archivo en la base de datos, pero lo que tu quieres es guardar los datos de tal o sea vas a leerlos, en programación existe un concepto que se llama Stream, que seria por ejemplo lo que tu alcanzas a leer y memorizar para después escribirlo por decir, la diferencia de las computadoras es que ellas no cambian palabras y es exacto, en C# los streams leen dato por dato, letra por letra o dicho mejor bit por bit y lo guardan en la base de datos.

    No dude en ampliar más sobre este tema si es que aún lo requiriera o de abrir una nueva consulta en caso de tener alguna otra situación o de necesitarla con algún otro de los productos de Microsoft.

     

    Adicional le invito a consultar los siguientes recursos:

    Guía para formular preguntas en el foro

    Channel 9 - donde puedes encontrar una sección de: Scripting en PowerShell

     

    Gracias por usar los foros de MSDN.

    Erick Rivera

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de    conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 22 de mayo de 2019 16:02
  • Muchisimas gracias por el apoyo !! realmente es muy interesante, ya que como les comento estoy iniciando y pues me cuesta un poco poder entender esta nueva programacion, pero verdaderamente lo agradezco y como lo menciono en un inicio, si hago una importacion mediante el icono de importar exportar datos, pues me resulta muy sencillo pasa derechito, ya que el archivo csv esta perfectamente bien delimitado y no me importa ahi si contiene 10 o 100 columnas el sql import export lo lee de la ubicacion donde se le indico que estaba el archivo y zaz hace la importacion derechita, que es lo que yo pretendo hacer via programacion, de todas formas en verdad agradezco a ustedes,,,,disculapas para ambas personas que me auxiliaron en este tema pero no estoy seguro cual es su nombre, espero sea Alberto y eRiver1, gracias son ustedes muy profesionales y muy amables. gracias de nuevo
    jueves, 23 de mayo de 2019 2:28
  • Muchisimas gracias por el apoyo !! realmente es muy interesante, ya que como les comento estoy iniciando y pues me cuesta un poco poder entender esta nueva programacion, pero verdaderamente lo agradezco y como lo menciono en un inicio, si hago una importacion mediante el icono de importar exportar datos, pues me resulta muy sencillo pasa derechito, ya que el archivo csv esta perfectamente bien delimitado y no me importa ahi si contiene 10 o 100 columnas el sql import export lo lee de la ubicacion donde se le indico que estaba el archivo y zaz hace la importacion derechita, que es lo que yo pretendo hacer via programacion, de todas formas en verdad agradezco a ustedes,,,,disculapas para ambas personas que me auxiliaron en este tema pero no estoy seguro cual es su nombre, espero sea Alberto y eRiver1, gracias son ustedes muy profesionales y muy amables. gracias de nuevo
    • Marcado como respuesta hecero jueves, 23 de mayo de 2019 2:28
    jueves, 23 de mayo de 2019 2:28
  • Debido a que no hemos recibido alguna notificación que aún se esté presentando el problema que enuncia en vuestra consulta y que la respuesta provista provee un amplio panorama y campo de acción sobre tu duda; nos gustaría considerar la misma como resuelta debido a la respuesta apropiada proporcionada  y así proceder a calificar la misma como respuesta.

    No dudes en ampliar más sobre este tema si es que aún lo requirieras o de abrir una nueva consulta en caso de tener alguna situación o necesitarla con algún otro de los productos de Microsoft.

     

    Adicional le invito a consultar los siguientes recursos:

    Guía para formular preguntas en el foro

    Channel 9 - Consejos para Administrar Visual Studio 

     

    Gracias por usar los foros de MSDN.

    Erick Rivera

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 23 de mayo de 2019 18:12