Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-07-2006
manoley23 manoley23 is offline
Miembro
 
Registrado: jul 2003
Posts: 18
Poder: 0
manoley23 Va por buen camino
problema al insertar en bd access

Hola a todos!!

Tengo un problema muy tonto, pero que me está volviendo medio majara.

Intento ejecutar la siguiente sentencia desde Delphi7, por ODBC contra
una BD Access, y con un componente Tquery:

insert into Tclase1 (id,c1,m2,i3) values (35,' :" '' :','aa',22)

Y me da un error de "missing right quote" y no lo acabo de entender... porque la comilla simple la estoy "escapando" con otra comilla simple.. la comilla doble si la pongo sola me la inserta bien... y los dos puntos lo mismo.. pero con segun que combinación, peta!

El campo en cuestión puede ser de tipo char o de tipo memo, el resultado es el mismo.

He probado hacerlo con params, pero.. me da otro tipo de error al pasarle un parámetro memo como .asmemo :S:S:S

En resumen, todavía no he conseguido poder insertar cualquier cosa en un campo de access desde delphi sin hacer ningun "chanchullo", y ya llevo tiempo probando. A alguien se le ocurre algo?

Muchas Gracias!!

Manolo.
Responder Con Cita
  #2  
Antiguo 20-07-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por manoley23
insert into Tclase1 (id,c1,m2,i3) values (35,' :" '' :','aa',22)
El problema es que aquí tienes 4 comillas simples (marcadas en rojo); Las dos centrales aunque parecen una doble son dos simples.

(1) Una opción es que te hayas equivocado en las centrales y deban ser una doble.
insert into Tclase1 (id,c1,m2,i3) values (35,' :" " :','aa',22)

(2) Otra opción es que las centrales deban ser una simple, con lo que tendrías que colocar 3 seguidas.
insert into Tclase1 (id,c1,m2,i3) values (35,' :" ''' :','aa',22)

¿No se si me he explicado?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 20-07-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!

También te sugiero que en lugar de poner los valores "a piñón" en la sentencia SQL utilices parámetros, te ahorrarás problemas de este tipo

Edu
Responder Con Cita
  #4  
Antiguo 20-07-2006
manoley23 manoley23 is offline
Miembro
 
Registrado: jul 2003
Posts: 18
Poder: 0
manoley23 Va por buen camino
hola!

Buenas!

Priimero, gracias a los 2 por contestar tan rapido!

La opción buena es la 2, es decir, quiero insertar los dos puntos, una comilla doble y una comilla simple. Lo que no entiendo es porqué dices que para insertar una comilla simple tengo que poner tres comillas :S. De todas formas, lo he probado por si acaso pero no va.

Lo curioso es que si lanzo mi insert original:

insert into Tclase1 (id,c1,m2,i3) values (35,' :" '' :','aa',22)

desde el SQLExplorer funciona perfectamente, pero desde delphi no :S

Por otro lado, con los parametros es cierto que este problema desaparece, pero me aparece otro :S
Se trata de que al intentar pasar algo como parametro a un memo así:

parambyname('loquesea').asmemo:='aquivaalgo'

tengo el mismo problema, dependiendo de lo que valga el 'aquivaalgo', sobre todo si le inserto comillas dobles ( otra vez grrr ) me da un error de "string truncado por la derecha" :S:S

y si se lo paso asi:

parambyname('loquesea').asstring:='aquivaalgo'

entonces no hace cosas raras, pero solo me deja insertar 255 caracteres, y necesito mas!!

Siento el rollo pero es que lo he probado de tantas formas y con tantos casos, que estoy desesperado!! Si alguien lo prueba con codigo y le funciona, que me lo pegue aqui por dios!!

Mushas gracias!

Manolo.
Responder Con Cita
  #5  
Antiguo 20-07-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
A ver, de dónde sale el texto largo? Si es de un TMemo, siempre puedes hacer paramByName('param').AsMemo := Memo1.Text y no tendrás problemas de longitudes!

Y si el texto es fijo, ten en cuenta que siempre tendrás de doblar las comillas, pero ojo no poner comillas dobles, sino poner dos veces las comillas simples, y en principio no tendría porque haber problema.

Un saludo

Edu
Responder Con Cita
  #6  
Antiguo 20-07-2006
manoley23 manoley23 is offline
Miembro
 
Registrado: jul 2003
Posts: 18
Poder: 0
manoley23 Va por buen camino
puesss...

... en teoria no tendría que haber problemas, lo se.. pero los hay!!

He probado que el texto salga de un tmemo, pero hace lo mismo..
y lo fuerte es que si en el memo pongo, por ej. 12345678901234 funciona ok.
Pero si pongo 1234567890123456 ( longitud 16, :S:S:S) entonces me da el error!!!

Se habrá vuelto loco mi PC? Al que encuentre el error le pago unas birras por Barcelona!

Manolo.
Responder Con Cita
  #7  
Antiguo 20-07-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por manoley23
Lo que no entiendo es porqué dices que para insertar una comilla simple tengo que poner tres comillas
Si quieres insertar 1 comilla simple, debe colocar tres (al menos desde Delphi), porque:
* Si colocas 1, delphi piensa que es una cadena sin acabar.
* Si colocas 2 delphi piensa que son el principio y el final de una cadena, que dentro no tiene nada.
* La forma de decirle a Delphi que coloque una comilla simple, es colocar tres, para que el encuentre el inicio, la cadena (comilla simple) y el final (en total 3 comillas).

En lugar de colocar esto:
,' :" '' :',

coloca esto:
,QuotedStr(':" ''' :'),
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 20-07-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!

Me puedes pasar el código? Me ha interesado el tema de las birras por Barcelona!

jejejejeje


Edu
Responder Con Cita
  #9  
Antiguo 20-07-2006
manoley23 manoley23 is offline
Miembro
 
Registrado: jul 2003
Posts: 18
Poder: 0
manoley23 Va por buen camino
tres comillas?

Neftali, con que version de delphi? yo uso la 7 ( aun ) y si le asigno a un string tres comillas simples:

str:=''';

el compilador ni compila!

De hecho de toda la vida yo he trabajado que para poner una comilla dentro de un string desde delphi, tienes que poner una comilla delante, osea, cada 2 comillas es una comilla, y siempre me ha funcionado ok.

Es decir,

str:='''';

es una cadena que contiene una comilla simple dentro.

Manolo.
Responder Con Cita
  #10  
Antiguo 20-07-2006
manoley23 manoley23 is offline
Miembro
 
Registrado: jul 2003
Posts: 18
Poder: 0
manoley23 Va por buen camino
el codigo...

... a ver, que he hecho un proyecto mu simple y sigue fallando, ahora falla cuando quiere, no depende de la longitud...

Código Delphi [-]

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls;

type
  TForm1 = class(TForm)
    Database1: TDatabase;
    Memo1: TMemo;
    Button1: TButton;
    Qinsertclase1: TQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Qinsertclase1  do begin
      UnPrepare;
      parambyname('id').asinteger:=1;
      parambyname('c1').asstring:='un texto';
      parambyname('m2').asmemo:=self.memo1.text;
      parambyname('i3').asinteger:=2;
      prepare;
      execsql;
  end;
end;


end.

y los .dfm del database y de la query

Código Delphi [-]
  object Database1: TDatabase
    AliasName = 'bdputomemo'
    DatabaseName = 'bdbd'
    SessionName = 'Default'
    Left = 232
    Top = 24
  end
  object Qinsertclase1: TQuery
    DatabaseName = 'BDBD'
    SQL.Strings = (
      'insert into Tclase1 (id,c1,m2,i3) values (:id,:c1,:m2,:i3)')
    Left = 276
    Top = 22
    ParamData = <
      item
        DataType = ftInteger
        Name = 'id'
        ParamType = ptUnknown
      end
      item
        DataType = ftString
        Name = 'c1'
        ParamType = ptUnknown
      end
      item
        DataType = ftMemo
        Name = 'm2'
        ParamType = ptInput
        Size = 2048
      end
      item
        DataType = ftInteger
        Name = 'i3'
        ParamType = ptUnknown
      end>
  end

He probado con el unprepare, sin el unprepare y con el close, con los dos..
dandole tiempo despues del prepare a que se prepare bien (cosas mas raras he visto ) ... con otros nombres de params (param0, param1 ) que no coincidan con los nombres de la tabla.. y nada!

Manolo.
Responder Con Cita
  #11  
Antiguo 20-07-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por manoley23
...con que version de delphi? yo uso la 7 ( aun ) y si le asigno a un string tres comillas simples

Tienes razón, tienes razón, tienes razón,...
Se me ha ido la olla y se me han cruzado los cables; Estaba con otra cosa...
Ni caso, no me hagáis ni caso...

Siento el fallo; lo dicho, ni caso...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #12  
Antiguo 20-07-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!

En l línea del parambyname del marámetro m2, cambia asmemo por value, así te pilla tipo variant y a ver qué tal!

Edu
Responder Con Cita
  #13  
Antiguo 20-07-2006
manoley23 manoley23 is offline
Miembro
 
Registrado: jul 2003
Posts: 18
Poder: 0
manoley23 Va por buen camino
nada...

... lo mismo ...

Manolo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error al insertar registros en Access Moises22 Conexión con bases de datos 2 09-01-2006 14:36:25
Problema al insertar registros en una BD epalacios SQL 4 07-06-2005 19:11:16
Problema al insertar con campo autoincremento predator SQL 0 23-11-2004 14:18:19
Insertar Numero Real en Access Franklim SQL 1 03-04-2004 15:11:40
Insertar una imagen en una DB de Access cone220 Gráficos 0 05-02-2004 13:24:32


La franja horaria es GMT +2. Ahora son las 17:47:53.


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
Copyright 1996-2007 Club Delphi