![]() |
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... |
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. |
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 |
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. |
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. |
ok. gracias por su ayuda chicos
hasta luego |
La franja horaria es GMT +2. Ahora son las 01:59:49. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi