Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Imagenes(BLOB) Firebird con VB6 (https://www.clubdelphi.com/foros/showthread.php?t=9879)

pzhero 04-05-2004 20:43:28

Imagenes(BLOB) Firebird con VB6
 
Hola a Todos aqui nuevamente moliendo.....

estoy intentando iniciar un proyecto en firebird 1.5 pero el acceso lo hago con Visual Basic 6 con el cual ya me puedo conectar y hacer consultas, el problema que tengo ahora, es con las imagenes, como ustedes saben, (si han leido mis consultas anteriores) estoy tratando de "migrar" de cierta manera una aplciacion que tengo en Oracle con el cual manejo imagenes, con oracle no tengo problemas utilizo la librerias OO4O, pero bueno... obviamente con firebird seria de otra manera el tratamiento del tipo BLOB con VB, he tratado de utilizar el tipo de datos Stream que proporciona la ADODB pero no funciona, al hacer el update me da un error "El proveedor de datos u otro servicio devolvio un esta do de E_FAIL" crei que tal vez era al go del objeto Stream e intente con los Métodos GetChunk y AppendChunk y me devuelve el mismo error, probé con SqlServer y Mysql y todo resultó muy bien solo con firebird es que me da este error y pues el proyeto es en Firebird que necesitaria continuarlo, y el manejo de imagenes es escencial en el proyecto a continuacion pongo los dos codigos:

Utilizando ADODB.Stream

Dim StrM As ADODB.Stream
Rs.Open "FOTOS", Cnn, adOpenStatic, adLockOptimistic, adCmdTable
Rs.AddNew
Set StrM = New ADODB.Stream
StrM.Type = adTypeBinary
StrM.Open
StrM.LoadFromFile "c:\monofasico1.gif"
Rs!IdImg = 234
Rs!foto = StrM.Read
Rs.Update
StrM.Close
Rs.Close




Utilizando Chunk's

Public Function ImgToFld(fldDestino As ADODB.Field, Optional sRutaImg As String) As Boolean
On Error GoTo lblError
Dim iOffset As Long
Dim iSizeFile As Long
Dim iArchivoImg As Integer
Dim VectorChunk() As Byte
Dim iFragmentOffset As Integer
Dim i As Integer
Dim lChunks As Long

ciSizeChunk = 100 'por ejemplo
iArchivoImg = FreeFile
Open sRutaImg For Binary Access Read As iArchivoImg
iSizeFile = LOF(iArchivoImg)
If iArchivoImg = 0 Then
Close iArchivoImg
End If

lChunks = iSizeFile \ ciSizeChunk
iFragmentOffset = iSizeFile Mod ciSizeChunk
'Copia el ultimo pedazo

ReDim VectorChunk(iFragmentOffset)
Get iArchivoImg, , VectorChunk()
fldDestino.AppendChunk VectorChunk()

ReDim VectorChunk(ciSizeChunk)
iOffset = iFragmentOffset
For i = 1 To lChunks
Get iArchivoImg, , VectorChunk()
fldDestino.AppendChunk VectorChunk()
Next
ImgToFld = True

Exit Function
lblError:

End Function


La cual llamo desde el siguiente bloque de codigo

Rs.Open "FOTOS", Cnn, adOpenStatic, adLockOptimistic, adCmdTable
Rs.AddNew
Rs!IdImg = 234
ImgToFld Rs!foto , "c:\monofasico1.gif"
Rs.Update
Rs.Close



he buscado documentacion y aun no encuentro si pudieran decirmem donde puedo encontrar la verdad no se que onda y gracias por su valiosa ayuda...

guillotmarc 04-05-2004 21:08:25

Hola.

Yo probaría directamente con un driver OleDb en lugar de uno ODBC y la pasarela ODBC - ADO.

Este parece ser el mejor driver OleDb para Firebird :

http://www.ibprovider.com/

Saludos.

pzhero 05-05-2004 01:21:29

Baje es instale el oledb, y todo ok. hice mis promeras pruebas y pude insertar una imagen, pero al despues ya no me inserta nada, me manda el siguente error

Execute:
SQLCODE=-303:
Dynamic SQL Error
SQL error code = -303
feature is not supported
BLOB and array data types are not supported for move operation
IBCODE=isc_dsql_error


puedodescargar la unica imagen que cargue, pero no puedo subir más imagenes, qeu estará pasando?? esta es mi linea de codigo que genera el error lo saque de la documentacion del IBProvider

StrM.LoadFromFile "c:\monofasico1.gif"
Dim ins_cmd As New ADODB.Command
ins_cmd.ActiveConnection = Cnn

ins_cmd.CommandText = "insert into fotos" & Chr(13) & _
"(idfoto,foto)" & Chr(13) & _
"values(?,?)"
Debug.Print ins_cmd.CommandText

ins_cmd.Parameters.Append ins_cmd.CreateParameter("idfoto", adBSTR, , , "123")
ins_cmd.Parameters.Append ins_cmd.CreateParameter("foto", adBSTR, , , StrM.Read)
ins_cmd.Execute

la cadena de conexión es la siguiente



server = "Provider=LCPI.IBProvider;data source=localhost:l:\firebird\PRUBABLOBLS.FDB;ctype=win1251;" & _
"user id=sysdba;password=masterkey"

Set Cnn = New ADODB.Connection
Cnn.ConnectionString = server
Cnn.CursorLocation = adUseClient
Cnn.Open
Cnn.Properties("Session AutoCommit") = True 'enable auto commit
Cnn.Properties("Autocommit Isolation Levels") = 4096 'read commited=0x1000


gracias por su ayuda

guillotmarc 05-05-2004 10:35:33

Hola.

No sé si estos Foros són los mas adecuados para esta consulta. Por mi parte hace bastantes años que no trabajo con Visual Basic, así que no te puedo ayudar mucho.

Quizá obtengas mejor resultado, si envias este código al creador del driver mailto:ibprovider@ibprovider.com

También puedes probar con algún Foro más específico de Visual Basic.

NOTA: Si yo hubiese de hacer esto en Visual Basic, en lugar de utilizar un Comando creado en tiempo de ejecución, probaria añadiendo un DataEnvironment al proyecto, y añadiendole la conexión y el Query. De esta forma, no tienes que crear nada en tiempo de ejecución (comando, parámetros, ...), solo pasar valores a los parámetros, y ejecutar el query. (solo lo digo para simplificar el código, aunque no tengo ni idea si puede ayudar en este problema).

Saludos.

Gydba 05-05-2004 13:53:50

Buenos días,

En primer lugar no comprendo porque querés realizar un insert mediante un comando, lo más natural sería utilizar un recordset o en su defecto la función execute del objeto connection, aunque el comentario de guillotmarc también es interesante.

En segundo lugar ADO no es completamente compatible con muchas de las BD del mercado (Aun hoy por hoy sigo luchando con los parámetros de las SP de Oracle), de hecho ultimamente creo que M$ es unicamente compatible con M$ :)

Y en tercer lugar nada, solo quería completar este post.

PD: Opino igual que guillotmarc de que deberías visitar foros mas específicos de VB.

pzhero 06-05-2004 15:32:45

ok. gracias por su ayuda chicos

hasta luego


La franja horaria es GMT +2. Ahora son las 04:25:59.

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