Problemas con campo varchar(max)
#1
Escrito 09 febrero 2012 - 01:27
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.
He intentado cambiar el campo y declararlo como text pero es igual siempre despues de 255 caracteres me guarda simbolos.
Espero me puedan dar una ayuda
Gracias
#2
Escrito 09 febrero 2012 - 02:10
¿Puedes mostrar tu código y si es posible la estructura de la tabla?
#3
Escrito 09 febrero 2012 - 03:15
#4
Escrito 09 febrero 2012 - 03:37
Amigo Marc el campo blob no exite en la version de sql server express 2005
este el codigo que uso para guardar
with Q_REC do begin SQL.Clear; 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) '); SQL.Add(' VALUES (:NU_REC,:FECHA,:RECIBI,:CAN_DE,:POR_CONC,:SALD_ANT,:ABO_H,:SALD_ACT,:CCLIE,:OBS_CXCCXP,:STATUS,:TOT_DOC)'); ParamByName('NU_REC').AsString:=RECIBO; ParamByName('FECHA').AsDate:=FECHACOB.Date; ParamByName('RECIBI').AsString:=NOMCLIE.Caption; ParamByName('CAN_DE').AsString:=LETRAS; ParamByName('POR_CONC').AsString:=PORC2; ParamByName('SALD_ANT').AsString:=SALD_ANT; ParamByName('ABO_H').AsString:=FORMATFLOAT('0.####',TDP.VALUE-DVV.VALUE); ParamByName('SALD_ACT').AsString:=SALD_ACT; ParamByName('CCLIE').AsString:=table1.FIELDBYNAME('CCLIE').AsString; ParamByName('OBS_CXCCXP').AsInteger:=CCOBS; ParamByName('STATUS').AsString:='A'; ParamByName('TOT_DOC').AsString:=FORMATFLOAT('0.####',TABLE1.FieldBYNAME('IMPORTE').AsCurrency); ExecSQL; end;
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]
#5
Escrito 09 febrero 2012 - 04:15
¿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....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....
Prueba por ahí y platicamos.
#6
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.
#7
Escrito 09 febrero 2012 - 05:31
Alguna vez yo tuve un problema muy parecido si no es que idéntico. Lo resolví satisfactoriamente cambiando la variable a tipo WideString....en cuanto al tipo de variable es string...
No le busques más, ésa es tu solución, a despecho que en un memo "veas" el contenido de la variable.
#8
Escrito 09 febrero 2012 - 06:47
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,
#9
Escrito 09 febrero 2012 - 08:15
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.... que SQL Server sólo te deja guardar los 255 caracteres...
Cuestión de coordinación entre el programador y el DBA, supongo.
#10
Escrito 09 febrero 2012 - 08:26
Podrías indicar que controlador estas utilizando,
porque el problema de los 255 caracteres aplica para conexiones ODBC
Saludos
#11
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...
#12
Escrito 10 febrero 2012 - 06:51
Entonces el amigo en cuestión nos podría indicar que controlador está utilizando,
Saludos
#13
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
no se que mas pueda hacer
la conexion es por BDE.
saludos
#14
Escrito 10 febrero 2012 - 03:11
Ése es el problema, precisamente. Utiliza conexiones ADO y la solución del widestring, así tu problema habrá muerto para siempre....la conexion es por BDE...
#15
Escrito 10 febrero 2012 - 03:45
Ése es el problema, precisamente. Utiliza conexiones ADO y la solución del widestring, así tu problema habrá muerto para siempre.
Saludos
#16
Escrito 10 febrero 2012 - 04:27
Muchas gracias por sus respuesta
saludos
#17
Escrito 11 febrero 2012 - 11:12
Saludos.
#18
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
#19
Escrito 11 febrero 2012 - 11:54
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,
#20
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.