FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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 |
#3
|
||||
|
||||
Cita:
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... |
#4
|
||||
|
||||
Si ejecutas la consulta desde el query analizer:
¿este sí te regresa todos los caracteres o tambien lo limita a 256?
__________________
|
#5
|
||||
|
||||
Cita:
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... |
#6
|
||||
|
||||
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).
__________________
|
#7
|
||||
|
||||
sigo sin encontrar respuesta a este problema... al final he decidido hacer lo siguiente:
y en delphi:
Pero si alguien tiene una idea mejor, pues eso, sería mucho mejor.
__________________
|
#8
|
||||
|
||||
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; ... |
#9
|
||||
|
||||
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.
|
|
|
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 |
|