none
insertar datos comprimidos en base de datos RRS feed

  • Pregunta

  • Hola,

    Tengo un método que me comprime los ficheros que le paso, alguien me puede decir cómo puedo pasar cada fichero comprimido de los que me ha generado a un registo blob de la tabla de base de datos.

    Gracias.


    ___

    miércoles, 16 de mayo de 2012 11:40

Todas las respuestas

  • Pues supongo que no hay que hacer nada especial excepto leer el archivo comprimido a un vector de byte.  Luego este vector se asigna a la propiedad Value de un SqlParameter para finalmente realizar un SqlCommand.ExecuteNonQuery().

    Jose R. MCP

    miércoles, 16 de mayo de 2012 14:11
    Moderador
  • Por favor dinos qué base de datos y que data provider (oledb, odbc, sqlclient, oracleclient, etc) estás usando para poderte orientar mejor. Lo que dice José es válido para bases de datos SQL Server con SQLClient como data provider.

    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    miércoles, 16 de mayo de 2012 14:53
  • hola

    de que base de datos estamos hablando ? lo pregunto porque mencionas el blob y no un campo varbinary de sql server

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 16 de mayo de 2012 15:04
  • mi base de datos es pl/sql, tengo una tabla con datos y un campo blob que es mi .rar que insertaré ahi,

    ahora creo un procedimiento en c# para insertar en mi base de datos con la siguiente cabecera:

    public void InsertarFicheros(int ID, DateTime FECHA, string DESCRIPCION, ????? blob)

    no se como declarar el blob en c#


    ___

    jueves, 17 de mayo de 2012 9:39
  • Blob no existe en c#, pero puedes pasar varios tipos de parámetro diferentes:

    • Pasar un stream del fichero: lo usarás para leer el contenido y escribirlo en el parámetro del procedimiento.
    • Pasar un buffer (arreglo de bytes)

    Yo haría lo segundo, así:

    public void InsertarFicheros(int ID, DateTime FECHA, string DESCRIPCION, byte[] blob)


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    jueves, 17 de mayo de 2012 9:44
  • Gracias Yván.

    me ha surgido otra duda respecto al insert into.

    Yo tengo lo siguiente:

    string cmdText = "INSERT INTO Tabla (ID, FECHA, DESCRIPCION, FICHERO) VALUES ("
                        + ID + ","
                        + "to_date('" + FECHA.ToString("dd/MM/yyyy HH:mm:ss") + "','dd/MM/yyyy HH24:mi:ss'),"
                        + "'" + DESCRIPCION + "'" + ","
                        + "'" + blob + "'" + ")";
    con la cabecera anterior del procedimiento blob es un problema, esa consulta  está mal, como puedo escribir blob en la consulta insert?


    ___

    jueves, 17 de mayo de 2012 11:41
  • No, lo que haces no se debe hacer de esa forma, y por suerte, en el caso particular de los blobs además no se puede. La forma correcta de insertar datos usando mySQL es crear un objeto mySqlCommand (asumo que estás usando el dotNet connector for mySQL):

    string cmdText = "INSERT INTO Tabla (ID, FECHA, DESCRIPCION, FICHERO) VALUES (?,?,?,?)"
    
    MySqlCommand mySQLCommand = new MySqlCommand();
    mySQLCommand.CommandText = cmdText
    mySqlCommand1.Parameters.Add("pId", ID);
    mySqlCommand1.Parameters.Add("pFecha", FECHA);
    mySqlCommand1.Parameters.Add("pDescripcion", DESCRIPCION);
    mySqlCommand1.Parameters.Add("pFichero", blob);
    

    Lo más importante es que tengas en cuenta que nunca, pero de verdad nunca debes construir una consulta SQL concatenando valores como lo estabas haciendo. Esa práctica es muy común y es un error gravísimo porque expones tu sistema a ataques de inyección de SQL:

    http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL

    Cuando necesites pasar parámetros a una consulta, SIEMPRE hay que usar un objeto Command y uno o varios objetos CommandParameter para que tu aplicación no sufra ataques de este tipo.


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    jueves, 17 de mayo de 2012 13:27
  • ok, tienes razon, pero eso no es mi duda, eso funcionaba bien, mi duda es esto:

    esta es mi cabecera del procedimiento:

    public void InsertarFicheros(int ID, DateTime FECHA, string DESCRIPCION, byte[] blob)

    Esto lo que se implementa dentro:

    string cmdText = "INSERT INTO Tabla (ID, FECHA, DESCRIPCION, FICHERO) VALUES (?,?,?,?)" MySqlCommand mySQLCommand = new MySqlCommand(); mySQLCommand.CommandText = cmdText mySqlCommand1.Parameters.Add("pId", ID); mySqlCommand1.Parameters.Add("pFecha", FECHA); mySqlCommand1.Parameters.Add("pDescripcion", DESCRIPCION); mySqlCommand1.Parameters.Add("pFichero", blob);

    no me inserta nada en la base de datos porque en pFichero guarda lo siguiente: System.Byte[] en vez del array

    que tengo que convertir byte[] blob a algo?

    Saludos.


    ___

    jueves, 17 de mayo de 2012 15:00