Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   problema al insertar en bd access (https://www.clubdelphi.com/foros/showthread.php?t=33910)

manoley23 20-07-2006 11:11:57

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.

Neftali [Germán.Estévez] 20-07-2006 12:01:52

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?

epuigdef 20-07-2006 12:18:32

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

manoley23 20-07-2006 12:32:23

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.

epuigdef 20-07-2006 12:37:30

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

manoley23 20-07-2006 12:59:34

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.

Neftali [Germán.Estévez] 20-07-2006 13:01:17

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(':" ''' :'),

epuigdef 20-07-2006 13:06:27

Buenas!

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

jejejejeje


Edu

manoley23 20-07-2006 13:07:32

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.

manoley23 20-07-2006 13:45:37

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.

Neftali [Germán.Estévez] 20-07-2006 13:47:52

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...

epuigdef 20-07-2006 13:58:47

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

manoley23 20-07-2006 14:16:31

nada...
 
... lo mismo ... :(

Manolo.


La franja horaria es GMT +2. Ahora son las 03:41:46.

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