Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2007
Coco Coco is offline
Miembro
 
Registrado: jul 2004
Ubicación: Argentina
Posts: 83
Poder: 21
Coco Va por buen camino
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.
__________________
Hice un trato con Dios... el no hace sistemas y yo hago milagros
Responder Con Cita
  #2  
Antiguo 16-02-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 24
poliburro Va por buen camino
Yo en lo personal te recomiendo que mejor uses ADO.

y el OleDb de sql server. A mi me va de maravilla
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 21-02-2007
Avatar de Arsenio
Arsenio Arsenio is offline
Miembro
 
Registrado: oct 2006
Posts: 13
Poder: 0
Arsenio Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 22-02-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
Si ejecutas la consulta desde el query analizer:
¿este sí te regresa todos los caracteres o tambien lo limita a 256?
__________________

Responder Con Cita
  #5  
Antiguo 22-02-2007
Avatar de Arsenio
Arsenio Arsenio is offline
Miembro
 
Registrado: oct 2006
Posts: 13
Poder: 0
Arsenio Va por buen camino
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...
Responder Con Cita
  #6  
Antiguo 22-02-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
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).
__________________

Responder Con Cita
  #7  
Antiguo 16-03-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
  #8  
Antiguo 16-03-2007
Avatar de Arsenio
Arsenio Arsenio is offline
Miembro
 
Registrado: oct 2006
Posts: 13
Poder: 0
Arsenio Va por buen camino
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; ...
Responder Con Cita
  #9  
Antiguo 16-03-2007
Avatar de Arsenio
Arsenio Arsenio is offline
Miembro
 
Registrado: oct 2006
Posts: 13
Poder: 0
Arsenio Va por buen camino
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;
...
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
Migrando Bde A Componentes Sqldirect ASAPLTDA Firebird e Interbase 2 09-05-2006 22:09:01
Migracion BDE a SQLDIRECT evaluacion ASAPLTDA Conexión con bases de datos 0 27-11-2004 23:08:12
Problema:.NET, Crystal Report, SQLServer o WinXP cacuna .NET 3 24-08-2004 22:52:45
ayuda SQLDirect v.2.9.7 ronimaxh Conexión con bases de datos 5 28-11-2003 18:19:33
problema sqlserver desde bde con tipos decimal borbi Conexión con bases de datos 4 22-10-2003 11:07:18


La franja horaria es GMT +2. Ahora son las 02:15:02.


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