Ir al contenido


Foto

Problemas con campo varchar(max)


  • Por favor identifícate para responder
26 respuestas en este tema

#1 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 09 febrero 2012 - 01:27

Hola que tal Amigos espero que tenga un buen dia todos.
Bueno tengo un pequeño problemita y espero que me puedan ayudar.

Estoy trabajando con una base sql server 2005 y d7, y en una tabla tengo declarado un campo varchar(max) donde
quiero guardar gran cantidad de informacion. el problemas que tengo es que hasta 255 caracteres me guarda bien la informacion.pero si argrego mas de 255 caracteres me guarda simbolos. (li)

He intentado cambiar el campo y declararlo como text pero es igual siempre despues de 255 caracteres me guarda simbolos. 8o|

Espero me puedan dar una ayuda
Gracias
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 09 febrero 2012 - 02:10

Saludos.

¿Puedes mostrar tu código y si es posible la estructura de la tabla?
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 09 febrero 2012 - 03:15

¿ Si vas a usar textos tan grandes, porqué no declaras simplemente el campo como Blob ?.
  • 0

#4 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 09 febrero 2012 - 03:37

Gracias amigos por responder

Amigo Marc el campo blob no exite en la version de sql server express 2005

este el codigo que uso para guardar


delphi
  1.   with Q_REC  do
  2.                       begin
  3.                         SQL.Clear;
  4.                         SQL.Add('INSERT INTO TAB_REC0'+NE+'(NU_REC,FECHA,RECIBI,CAN_DE,POR_CONC,SALD_ANT,ABO_H,SALD_ACT,CCLIE,OBS_CXCCXP,STATUS,TOT_DOC) ');
  5.                         SQL.Add(' VALUES (:NU_REC,:FECHA,:RECIBI,:CAN_DE,:POR_CONC,:SALD_ANT,:ABO_H,:SALD_ACT,:CCLIE,:OBS_CXCCXP,:STATUS,:TOT_DOC)');
  6.                         ParamByName('NU_REC').AsString:=RECIBO;
  7.                         ParamByName('FECHA').AsDate:=FECHACOB.Date;
  8.                         ParamByName('RECIBI').AsString:=NOMCLIE.Caption;
  9.                         ParamByName('CAN_DE').AsString:=LETRAS;
  10.                         ParamByName('POR_CONC').AsString:=PORC2;
  11.                         ParamByName('SALD_ANT').AsString:=SALD_ANT;
  12.                         ParamByName('ABO_H').AsString:=FORMATFLOAT('0.####',TDP.VALUE-DVV.VALUE);
  13.                         ParamByName('SALD_ACT').AsString:=SALD_ACT;
  14.                         ParamByName('CCLIE').AsString:=table1.FIELDBYNAME('CCLIE').AsString;
  15.                         ParamByName('OBS_CXCCXP').AsInteger:=CCOBS;
  16.                         ParamByName('STATUS').AsString:='A';
  17.                         ParamByName('TOT_DOC').AsString:=FORMATFLOAT('0.####',TABLE1.FieldBYNAME('IMPORTE').AsCurrency);
  18.                         ExecSQL;
  19.                       end;
  20.  



Porc2 es una variable donde guardo la informacion y ya prove mostrandola en un memo antes de guardarla y esta bien.pero cuando corro la query con el codigo en la tabla me muestra simbolo.

esta es la estructura de la tabla
[img]http://http://desmond.imageshack.us/Himg59/scaled.php?server=59&filename=imagenyv.png&res=medium[/img]
  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 febrero 2012 - 04:15

...Porc2 es una variable donde guardo la informacion y ya prove mostrandola en un memo antes de guardarla y esta bien.pero cuando corro la query con el codigo en la tabla me muestra simbolo....

¿Y qué tipo de variable utilizas para contener el dato dentro de Delphi? ¿String o WideString? Por que String tiene la limitante a los 255 caracteres y WideString no tiene un límite; o al menos, un límite que llenes fácilmente.

Prueba por ahí y platicamos.
  • 0

#6 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 09 febrero 2012 - 04:46

¿Y qué tipo de variable utilizas para contener el dato dentro de Delphi? ¿String o WideString? Por que String tiene la limitante a los 255 caracteres y WideString no tiene un límite; o al menos, un límite que llenes fácilmente.

Prueba por ahí y platicamos.


amigo TiammatMX gracias por contestar

en cuanto al tipo de variable es string y si guarda la informacion en la variable porque ya lo mostre en un memo y me lo muestra bien. El problema que tengo en cuando guardo los datos a la tabla, en el campo de la tabla es donde me muestra loos simbolos. Llevo ya dos dias dandole vuelta al asunto y todavia no logro decifrarlo.



  • 0

#7 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 febrero 2012 - 05:31

...en cuanto al tipo de variable es string...

Alguna vez yo tuve un problema muy parecido si no es que idéntico. Lo resolví satisfactoriamente cambiando la variable a tipo WideString.

No le busques más, ésa es tu solución, a despecho que en un memo "veas" el contenido de la variable.
  • 0

#8 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 09 febrero 2012 - 06:47

Saludos a todos,

Por experiencia te puedo comentar que SQL Server sólo te deja guardar los 255 caracteres,
la solución a este inconveniente fue adicionar otro campo y guardar la información por medio de
un SP al cual se le envian los dos campos.

En la parte del código, realizamos la extracción de los primeros 255 caracteres para el primer campo
y luego el resto para el segundo.


Espero te sirva,

  • 0

#9 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 febrero 2012 - 08:15

... que SQL Server sólo te deja guardar los 255 caracteres...

Pues lamento contradecirte, pero actualmente estoy usando un widestring y he logrado guardar tanto en MS SQL Server 2000 como en 2008 variables widestring de más de 2,000 caracteres en campos VarChar(max)..., y usando Delphi 6.

Cuestión de coordinación entre el programador y el DBA, supongo.
  • 0

#10 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 09 febrero 2012 - 08:26

Hola,

Podrías indicar que controlador estas utilizando,
porque el problema de los 255 caracteres aplica para conexiones ODBC



Saludos
  • 0

#11 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 09 febrero 2012 - 09:29

...Podrías indicar que controlador estas utilizando...


Utilizo ADO, y además con el silvestrísimo TADOConnection. Tengo prohibidísimo por mi patrón utilizar componentes de terceros, aunque yo quisiera...  *-)
  • 0

#12 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 10 febrero 2012 - 06:51

Hola buen día,

Entonces el amigo en cuestión nos podría indicar que controlador está utilizando,

Saludos
  • 0

#13 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 10 febrero 2012 - 12:25

Hola buen día,

Entonces el amigo en cuestión nos podría indicar que controlador está utilizando,

Saludos


hola amigo realmente soy un poco novato en delphi
pero los cambio de la declaracion de variable de string a widestring ya lo hice y todavia me sigue mostrnado simbolos 8o|

no se que mas pueda hacer

la conexion es por BDE.

saludos
  • 0

#14 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 10 febrero 2012 - 03:11

...la conexion es por BDE...

Ése es el problema, precisamente. Utiliza conexiones ADO y la solución del widestring, así tu problema habrá muerto para siempre.
  • 0

#15 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 10 febrero 2012 - 03:45

Como dijo TiammatMX:

Ése es el problema, precisamente. Utiliza conexiones ADO y la solución del widestring, así tu problema habrá muerto para siempre.


Saludos
  • 0

#16 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 10 febrero 2012 - 04:27

haa ya veo.

Muchas gracias por sus respuesta (y)

saludos
  • 0

#17 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 11 febrero 2012 - 11:12

¿ Ya tienes muy avanzado el proyecto ?, si cambiaras a una base de datos libre (como la excelente Firebird o PostgreSQL) no te encontrarías con estas limitaciones arbitrarias de no poder usar campos Blob.

Saludos.
  • 0

#18 leofuentes21

leofuentes21

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 11 febrero 2012 - 11:43

¿ Ya tienes muy avanzado el proyecto ?, si cambiaras a una base de datos libre (como la excelente Firebird o PostgreSQL) no te encontrarías con estas limitaciones arbitrarias de no poder usar campos Blob.

Saludos.


que tal amigo

El sistema ya esta creado es una modificacion que pidio un cliente, pero ya que no se puede de esa forma habra que pensar en otra manera como resumir la informacion o bien guardar la informacion en 2 campos y unirlos al mostrar la informacion.
tampoco seria bueno cambiar los componentes por que seria modificar todo el sistema y eso me llevaria mucho tiempo y solo por esa modificacion creo que no es factible.

saludos
  • 0

#19 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 febrero 2012 - 11:54

Hola,
Que yo sepa, el tipo de dato string de la era de Pascal almacenaba hasta 255 caracteres. En Delphi, al menos en la versión 6 en adelante, el tipo string es un alias de un long-string (AnsiString) que no posee limitante a cierta cantidad de caracteres, sino que responde al límite máximo de memoria que puede destinar el SO: 2GB (en 32bits, al menos).

Intuyo que el problema pasa más por una cuestión de unicode  ;), que justamente para eso es que existe WideString, que no es más que un ANSIString extendido para almacenar carácteres de 16-bits (los carácteres ANSI son de 8-bits). Y nuevamente, la limitante está dada por los 2GB.

Saludos,
  • 0

#20 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 11 febrero 2012 - 12:36


¿ Ya tienes muy avanzado el proyecto ?, si cambiaras a una base de datos libre (como la excelente Firebird o PostgreSQL) no te encontrarías con estas limitaciones arbitrarias de no poder usar campos Blob.

Saludos.


que tal amigo

El sistema ya esta creado es una modificacion que pidio un cliente, pero ya que no se puede de esa forma habra que pensar en otra manera como resumir la informacion o bien guardar la informacion en 2 campos y unirlos al mostrar la informacion.
tampoco seria bueno cambiar los componentes por que seria modificar todo el sistema y eso me llevaria mucho tiempo y solo por esa modificacion creo que no es factible.

saludos


En este caso, olvídemonos de otras Bases de Datos. :).

Pero si tienes que comprimir la información, o separarla en dos campos, eso son soluciones "feas".

Ya puestos a utilizar una solución "fea", tienes otra alternativa, y es usar ADO, pero no para todo el proyecto (ya que como dices, es una tarea enorme, y hay que seguir la norma de "si funciona, no lo toques"). Simplemente añade un ADOConnection a tu proyecto, y solo para el Dataset que contiene ese campo, utiliza un ADOQuery y no un BDEQuery.

Así todo tu programa funciona tal y como lo venía haciendo, y esa tabla ya no te dará problemas puesto que accederás a ella con un componente moderno.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.