Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Problema SqlDirect con SqlServer (https://www.clubdelphi.com/foros/showthread.php?t=40156)

Coco 08-02-2007 14:46:21

Problema SqlDirect con SqlServer
 
Estoy trabajando con Delphi 7 y me conecto a una base de datos Sql Server utilizando el componente SqlDirect. El problema se me presenta cuando necesito trabajar con campos de la base que sean varchar con una longitud mayor a 255 caracteres.
Cuando realizo el insert o update de la tabla graba todos los datos en el campo inidicado, pero cuando necesito leer los datos solo me trae los primeros 255 caracteres y no puedo recuperar los demas datos.
No se si se trata de un error en algunos de los parametros de conexion a la base en el cual haya que indicar que se va a trabajar con varchar largos o si bien hay que tratar a estos campos de alguna forma en particular.
Si alguien le ha pasado esto o concoce una solucion, se lo agradeceria. Desde ya muchas gracias.

poliburro 16-02-2007 04:32:36

Yo en lo personal te recomiendo que mejor uses ADO.

y el OleDb de sql server. A mi me va de maravilla

Arsenio 21-02-2007 19:12:11

Cita:

Empezado por Coco
Estoy trabajando con Delphi 7 y me conecto a una base de datos Sql Server utilizando el componente SqlDirect. El problema se me presenta cuando necesito trabajar con campos de la base que sean varchar con una longitud mayor a 255 caracteres.

Hasta con la versión 5.1 de SQLDirect dice:
Known problems
1. It is impossible to get more then 255 byte for a char/binary column of MS SQL Server 7, so that DB-Lib does not return more then 255 byte for these columns (MS SQL Server 7 truncates data in case of connecting through DB-Library). The reason is the following: Microsoft did not add new features of MS SQL Server 7 for DB-Library.

Te digo lo mismo que poliburro... usá ADO...

ContraVeneno 21-02-2007 23:43:24

Si ejecutas la consulta desde el query analizer:
¿este sí te regresa todos los caracteres o tambien lo limita a 256?

Arsenio 22-02-2007 01:49:34

Cita:

Empezado por ContraVeneno
Si ejecutas la consulta desde el query analizer:
¿este sí te regresa todos los caracteres o tambien lo limita a 256?

El problema es solo cuando usás el componente SQLDirect, que usa la vieja biblioteca de Microsoft DB-Library, en el query analizer sale bien.
Si el problema lo tenés en algunas pocas consultas, en vez de reemplazar el SQLDirect por ADO podés hacerte una función que traiga el campo de a 255 caracteres y luego por código los unís... con las funciones LEN(CAMPO) para saber el tamaño y SUBString(CAMPO, inicio, tamaño) para obtener las porciones de texto...

Obvio que solo sirve si el problema lo tenés en pocos lugares...

ContraVeneno 22-02-2007 02:40:13

Pues a mi en el query analizer solo me trae 256 caracteres...

además de que por la forma en el sistema esta diseñado, no puedo quitar el SQLDirect, vaya, que estoy obligado a usarlo. De otra forma tendría que hacer miles de cosas extra, que igual y mejor voy empezando... pero en fin

mi principal duda es que en el query analizar de sql2000, me regresa solo 256 caracteres, aunque si esta bien guardado ya que al hacer un len(campo) me regresa 456 (que es la cantidad de caracteres guardados en el campo).

ContraVeneno 15-03-2007 23:59:16

sigo sin encontrar respuesta a este problema... al final he decidido hacer lo siguiente:
Código SQL [-]
Select substring(Recomendaciones,1,255) as Recom1, substring(Recomendaciones,256,256), as Recom2
from Tabla


y en delphi:
Código Delphi [-]
with datamod.sdquery1 do begin
memRecom.Text:= FieldByname('Recom1').AsString+FieldByname('Recom2').AsString;
end;

Pero si alguien tiene una idea mejor, pues eso, sería mucho mejor.

Arsenio 16-03-2007 13:08:02

Básicamente yo lo solucioné de la misma forma, pero lo hice en una función un poco más general, para usarla de donde tenga ese problema (solo en los campos Memo o Varchar). Si se crean nuevos campos en la base ya los hago que sean Text.

Código Delphi [-]class function TFuncionesComponentes.TraerCampoGrandeSQLServer(Tabla, Campo, FiltroParaUnRegistro, TextoCampo: String): string; ... //Traigo la longitud del campo Qry.Sql.Text := 'SELECT LEN('+Campo+') AS LONGITUD FROM '+Tabla; ... CantidadVeces := TamanioCampo DIV sizeDiv; if ((TamanioCampo MOD sizeDiv)<>0) then CantidadVeces := CantidadVeces + 1; ... sizeDiv := 255; with Qry.SQL do begin Clear; Add('SELECT SubString('+Campo+',1,'+IntToStr(sizeDiv)+') AS P1'); //El inicio lo paro en un caracter más i := sizeDiv + 1; for j := 2 to CantidadVeces do begin Add(', SubString('+Campo+','+IntToStr(i)+','+IntToStr(sizeDiv)+') AS P'+IntToStr(j)); i := (j * sizeDiv) + 1; end; Add('FROM '+Tabla); Add('WHERE '+FiltroParaUnRegistro); end; Qry.Open; //Ahora tengo que unir todos los substrings que obtube StrTemp := ''; for j := 1 to CantidadVeces do StrTemp := StrTemp + qry.FieldByName('P'+IntToStr(j)).AsString; Result := StrTemp; ...

Arsenio 16-03-2007 13:09:45

Básicamente yo lo solucioné de la misma forma, pero lo hice en una función un poco más general, para usarla de donde tenga ese problema (solo en los campos Memo o Varchar). Si se crean nuevos campos en la base ya los hago que sean Text.

Código Delphi [-]
class function TFuncionesComponentes.TraerCampoGrandeSQLServer(Tabla, Campo, 
FiltroParaUnRegistro, TextoCampo: String): string;
...
//Traigo la longitud del campo
Qry.Sql.Text := 'SELECT LEN('+Campo+') AS LONGITUD FROM '+Tabla;
...
CantidadVeces := TamanioCampo DIV sizeDiv;
if ((TamanioCampo MOD sizeDiv)<>0) then CantidadVeces := CantidadVeces + 1;
...
sizeDiv := 255;
with Qry.SQL do
begin
  Clear;
  Add('SELECT SubString('+Campo+',1,'+IntToStr(sizeDiv)+') AS P1');
  //El inicio lo paro en un caracter más
  i := sizeDiv + 1;
  for j := 2 to CantidadVeces do
  begin
    Add(', SubString('+Campo+','+IntToStr(i)+','+IntToStr(sizeDiv)+') AS P'+IntToStr(j));
    i := (j * sizeDiv) + 1;
  end;
  Add('FROM '+Tabla);
  Add('WHERE '+FiltroParaUnRegistro);
end;
Qry.Open;
//Ahora tengo que unir todos los substrings que obtube
StrTemp := '';
for j := 1 to CantidadVeces do
StrTemp := StrTemp + qry.FieldByName('P'+IntToStr(j)).AsString;
Result := StrTemp;
...


La franja horaria es GMT +2. Ahora son las 23:05:36.

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