Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   script sql insert into (campo blob) (https://www.clubdelphi.com/foros/showthread.php?t=74090)

Casimiro Notevi 30-05-2011 14:02:10

script sql insert into (campo blob)
 
Hola, he estado buscando, y no he encontrado, algo que necesito hacer, no sé si la edad me nubla la mente o es el calor que hace, pero no lo consigo, me explico:

Lo necesito en un script sql donde se crea una base de datos, sus dominios, generadores, tablas, procedimentos almacenados, triggers y... datos predeterminados.

Pues bien, en el script quiero insertar una serie de ficheros, son informes, y no encuentro la forma de hacerlo, sería algo así como:

Código SQL [-]
insert into tbInformes values (123, 'Título del informe', blob_load('Extractos.rep'), current_timestamp);

El 'blob_load' sería lo que estoy buscando, suponiendo que exista algo así.
También me valdría hacerlo mediante un 'store procedure'.

Gracias por los consejos, que vuestro Dios os lo pague con mucha buena salud, que nunca os falte 50 euros en el bolsillo y que tengáis amor para dar y regalar
:)

marcoszorrilla 30-05-2011 15:07:14

No tengo tiempo, para mirarlo, pero echalo un ojo por si te puede servir de base.
Código SQL [-]
               BLOB Reading Example (C#)             

                                                TEST.SQL Script (Testing Database)

 Run the following script to create the testing database. It creates a simple table called MYTABLE with a single row. (How to create a database from an SQL script):
CREATE TABLE MYTABLE (     ID   INTEGER,     VAL  BLOB SUB_TYPE 0 SEGMENT SIZE 80 ); Reading values

 Because it is not possible to insert binary BLOB value in the SQL script we need to insert it in the code before reading.
 The following sample prints the values from the column "VAL" to console:
string database = "test.fdb";  CreateEmbeddedDb(database, "test.sql");  FbConnectionStringBuilder csb = new FbConnectionStringBuilder(); csb.ServerType = 1; csb.Database = database;  using (FbConnection c = new FbConnection(csb.ToString())) {   c.Open();          FbCommand cmdInsert = new FbCommand("INSERT INTO mytable(id, val) VALUES(@id, @val)", c);   cmdInsert.Parameters.Add("@id", 1);   cmdInsert.Parameters.Add("@val", new byte[] {1, 2, 3});   cmdInsert.ExecuteNonQuery();    FbCommand cmd = new FbCommand("SELECT val FROM mytable", c);            using (FbDataReader r = cmd.ExecuteReader())   {     while (r.Read())     {       int size = 20;       byte[] bytes = new byte[size];       long count = r.GetBytes(0, 0, bytes, 0, size);       for(int i = 0; i < count; i++)         Console.WriteLine("Value: " + bytes[i]);     }   } } 


             
                            
             Copyright © 2005 - 2007 DotNetFirebird
Un Saludo.

Casimiro Notevi 30-05-2011 16:55:03

Gracias :)
Ha salido un poco "descuadrado", pero creo que es esto:

Código:

string database = "test.fdb";

CreateEmbeddedDb(database, "test.sql");

FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
csb.ServerType = 1;
csb.Database = database;

using (FbConnection c = new FbConnection(csb.ToString()))
{
    c.Open();
           
    FbCommand cmdInsert = new FbCommand("INSERT INTO mytable(id, val) VALUES(@id, @val)", c);
    cmdInsert.Parameters.Add("@id", 1);
    cmdInsert.Parameters.Add("@val", new byte[] {1, 2, 3});
    cmdInsert.ExecuteNonQuery();

    FbCommand cmd = new FbCommand("SELECT val FROM mytable", c);
               
    using (FbDataReader r = cmd.ExecuteReader())
    {
        while (r.Read())
        {
            int size = 20;
            byte[] bytes = new byte[size];
            long count = r.GetBytes(0, 0, bytes, 0, size);
            for(int i = 0; i < count; i++)
                Console.WriteLine("Value: " + bytes[i]);
        }
    }
}

El caso es que dice esto:

Cita:

Because it is not possible to insert binary BLOB value in the SQL script we need to insert it in the code before reading.
El ejemplo, la verdad, es que no lo entiendo, y parece que no es lo que ando buscando.

guillotmarc 30-05-2011 23:40:19

Hola Casimiro.

Utilizando los scripts de IB-Experts puedes hacerlo tal y como propones. El problema es que después ese script solo lo va a reconocer el mismo IB-Expert o la utilidad de línea de comandos IBEscript.exe, también de ellos (esto último es lo que utilizo yo).

La única alternativa que se me ocurre es que utilices una UDF de las que incorporan esta función blob_load (o similar). No me gusta depender de UDF's de terceros, pero no parece que haya muchas más soluciones.

http://www.ibphoenix.com/download/tools/udf#59

Casimiro Notevi 31-05-2011 02:37:11

¿Y cómo lo haces con los scripts de ibexpert?, realmente me viene bien porque es sólo para yo cargar los informes en la BD, no tienen que usarlo luego los clientes. Es para mí.

Porque meter UDFs no me fio, porque luego los servidores van siempre en distintos versiones de linux y vaya a encontrar algún problema inesperado.

guillotmarc 31-05-2011 09:05:49

Aquí tienes un ejemplo en los scripts avanzados de IBExpert :

http://www.ibexpert.net/ibe/index.ph...sIntoADatabase

SET BLOBFILE 'C:\f.jpg';
INSERT INTO ... VALUES (..., :h00000000_FFFFFFFF);
SET BLOBFILE 'C:\f2.jpg';
INSERT INTO ... VALUES (..., :h00000000_FFFFFFFF);
SET BLOBFILE 'C:\f3.jpg';
INSERT INTO ... VALUES (..., :h00000000_FFFFFFFF);

Saludos.

guillotmarc 31-05-2011 10:15:02

Cita:

Empezado por Casimiro Notevi (Mensaje 401934)
Porque meter UDFs no me fio, porque luego los servidores van siempre en distintos versiones de linux y vaya a encontrar algún problema inesperado.

Te entiendo perfectamente, yo tampoco utilizo ninguna UDF de terceros (e incluso de las UDF's propias de Firebird, recurro a ellas lo mínimo posible, básicamente solo cuando hago procesos de importación de datos).

Casimiro Notevi 31-05-2011 12:19:42

Muchas gracias por la ayuda, lo he probado y aunque no da error alguno, sin embargo, no inserta el archivo, lo guarda como null. El resto de campos están bien, pero el blob está a null. No sé si será porque tengo una versión "personal" y esté limitado en ese aspecto, aunque no da error, ya digo.

También he probado a usar el otro método que viene en ese enlace que has puesto, el de ibeblock, y directamente me dice: "Nada que hacer", así sin más, sin errores ni nada.
Sospecho que será por la versión.

guillotmarc 31-05-2011 14:17:21

Cita:

Empezado por Casimiro Notevi (Mensaje 401979)
Muchas gracias por la ayuda, lo he probado y aunque no da error alguno, sin embargo, no inserta el archivo, lo guarda como null. El resto de campos están bien, pero el blob está a null. No sé si será porque tengo una versión "personal" y esté limitado en ese aspecto, aunque no da error, ya digo.

También he probado a usar el otro método que viene en ese enlace que has puesto, el de ibeblock, y directamente me dice: "Nada que hacer", así sin más, sin errores ni nada.
Sospecho que será por la versión.

Es curioso. No creo que sea un problema de la versión Personal, ni de la antiguedad de la versión (llevo usando lo del set blobfile desde hace muchos años).

Probablemente sea más bien un detalle de la localización del archivos, no sé si la dirección tiene que ser referenciada al equipo servidor Firebird o al cliente (aunque creo que es al cliente, el IBExpert o IBScript, que es el que conoce como manejar estas ampliaciones de scripts).

Haz una prueba sencilla, con el IBEscript.exe, el fbclient.dll, y la base de datos, en la misma carpeta (en conexión local), y no marques ninguna ruta para el acceso al archivo a cargar, solo el nombre. Si esto funciona bien, entonces ya puedes seguir haciendo otras pruebas hasta identificar el direccionamiento correcto para los archivos a cargar.

NOTA: Imagino que has puesto el código :h00000000_FFFFFFFF como valor del campo blob, tal y como marca el ejemplo. Esto le marca al script desde donde hasta donde tiene que cargar del archivo de datos (ya que puedes poner distintas secciones del mismo archivo en diferentes campos, algo que tampoco parece algo muy útil, la verdad).

Casimiro Notevi 31-05-2011 16:18:30

Cita:

IBEScript.exe can be found in the IBExpert root directory, and needs to be started from DOS. (This feature is unfortunately not included in the Personal Edition.)
Ya podían sacar un mensajito o algo, que se queda uno con cara de tonto mirando la pantalla para ver si ha habido un error :mad:

Descargaré una versión de prueba y luego la quitaré.

Casimiro Notevi 31-05-2011 19:05:03

En la versión trial sí lo trae, lo he instalado y probado:



Aparentemente todo bien, sin embargo:



¡¡¡nulo!!! :confused:

Voy a tener que hacer un programita delphi para cargarlos, porque se trataba de ahorrar tiempo y finalmente estoy perdiendo más tiempo en estas pruebas que en hacer el programita :)


La franja horaria es GMT +2. Ahora son las 17:05:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi