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)
-   -   Problemas al insertar cadenas que contienen el caracter ´ (https://www.clubdelphi.com/foros/showthread.php?t=36203)

Isnel 04-10-2006 21:31:14

Problemas al insertar cadenas que contienen el caracter ´
 
Hola

Necesito insertar una cadena de texto en un campo de una base de datos en InterBase 6.5 Dialect 3, pero la cadena de texto contiene el caracter ´ y se produce un error. La cosa es esta

INSERT INTO ERRORES (ERR) VALUES(´5/ 8/06 10:54PM 00:01´24" 7380´)

Como ven la cadena contiene ´ que se usa para identificar el minuto.

¿Que se puede hacer?

Caral 04-10-2006 21:39:16

Respuesta tonta:
En vez de ' no servira un . (punto) u otros : (dos puntos)
lo as probado ?
Saludos

Hagen 04-10-2006 22:03:17

No veo ningun problema !!
 
Hola.

Estas confundiendo ' con ´

son diferentes, en Interbase/Firebird usas ' para las cadenas:

'esto es una cadena'

La sentencia correcta seria:


INSERT INTO ERRORES (ERR) VALUES ('5/ 8/06 10:54PM 00:01´24" 7380')

Isnel 11-10-2006 15:25:24

Sigue el problema
 
Fue un error mio al plantear al confundir el caracter ' por ´, en realidad sigo teniendo el problema porque lo que necesito es esto:

INSERT INTO ERRORES (ERR) VALUES ('5/ 8/06 10:54PM 00:01'24" 7380')

No puedo sustituir el caracter ' por otro pues esta cadena la recibo desde un autómata y no se le puede cambiar el formato en que trasmite y necesito almacenarla con ese mismo formato.

fly 12-10-2006 05:14:06

Prueba a filtrar la cadena añadiendo otras comillas (simples) , yo acabo de pasar una DB de Dialesct 1 al 3 y esta funcion me sigue valiendo (aunque antes usaba 2 comillas dobles "" en vez de dos simples ''

Código Delphi [-]
Function TDMF1.TextoSQL(txt : string):string; // Pone comillas al inicio y final del texto
   var c : integer;                       // tambien cambia las comillas por unas dobles
       txt2: string;
  begin

  txt2:='''';
    for c:=1 to Length(txt) do
       if txt[c]<>''''
          then txt2:=txt2+txt[c]
          else txt2:=txt2+''''''; // convertimos las comillas en doble_comillas

    txt2:=txt2+'''';
    TextoSQL:=txt2;
  end;

Su uso es tan simple como la propia función (yo uso unas TIBQuery de lo mas normalito) :

Código Delphi [-]
  Dmf1.edit_q.SQL.Text:=
        ' INSERT INTO Articulos (ref, nombre) '+
        ' VALUES ('+
         Dmf1.TextoSQL(edit_ref.Text)+', '+
         Dmf1.TextoSQL(edit_nom.Text)+
        ')';

  dmf1.edit_q.Close;
  dmf1.edit_q.Prepare;
  dmf1.edit_q.ExecSQL;

A ver si esto te vale, Suerte.

jachguate 12-10-2006 17:16:14

Cita:

Empezado por Isnel
INSERT INTO ERRORES (ERR) VALUES ('5/ 8/06 10:54PM 00:01'24" 7380')

No puedo sustituir el caracter ' por otro pues esta cadena la recibo desde un autómata

¿que cadena es la que recibís del autómata? ¿el insert completo? ¿la cadena de la fecha?

Aún cuando se reciba de un autómata, podes aplicar cualquier transformación a ella. Finalmente, suponiendo que la cadena que recibís del autómata es la fecha, de esta forma:


5/ 8/06 10:54PM 00:01'24" 7380

y que eso lo queres almacenar en firebird, podrías o bien valerte de un parámetro:

Código SQL [-]
insert into tabla (campo) values (:parametro)
Código Delphi [-]
  CadenaAutomata := NuevaCadenaDelAutomata;
  qInsert.ParamByName('parametro').AsString := CadenaAutomata;

Si lo que precisas es construir una sentencia sql válida, entonces yo haría:

Código Delphi [-]
  CadenaAutomata := NuevaCadenaDelAutomata;
  q1.SQL.Text := Format('insert into tabla (campo) values (%s)', [
    QuotedStr(CadenaAutomata)]);

Hasta luego.

;)

fly 13-10-2006 05:19:55

Joder jachguate que bueno y oportuno!!!! voy a aprovechar que estoy pasando todo a Dialect 3 para tirar a la basura mi viejo TextoSQL() y cambiarlo por QuotedStr().

Creo que debo leer más ;) me estoy empezando a oxidar....

Saludos y gracias a ambos.

Isnel 13-10-2006 17:58:12

Sustituir el caracter ' por 2 '' funciona a la perfección fly.

No he probado el uso de parámetros que propone jachguate, pero creo que es muy interesante y debe funcionar


La franja horaria es GMT +2. Ahora son las 00:08:31.

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