Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: wolf_kof en Febrero 11, 2010, 12:26:51 am
-
Hola a todos, Graxias por sus consejos me han servido mucho, especialmente agradesco a SSCCAANN por su tiempo al darme soluciones.
AHORA tengo un problema que creo que no es tan grandre, pero por ingnorancia tambien se peca, Como guardo una Imagen en SQL Server 2000 con VB 6.0 Utilizando ADODC1
saben que no me gustan las conexiones por codigo prefiero lo grafico
GRACIAS POR LA AYUDA DE ANTEMANO
-
Te explico, lo mejor que puedes hacer es almacenar la ruta del archivo jpg que es más liviano que bmp en la bd. y mantienes todas las imagenes o fotos en un directorio, identificada por el codigo que tenga el registro en la tabla de tu bd. Cuando llames o busques al registro, pues haces un Load.Picture y ya! espero me hayas comprendido...!
-
Ok Comprendido!!!, pero queria guardarlas en la BD :'(
-
3 cajas de texto
3 botones
1 Image1
1 Adodc1
1 CommonDialog1
Codigo de sql La Base de datos se llama ejmplo :)
Create database ejmplo
go
use ejmplo
go
Create table usuarios(
cod_usu char(4) primary key,
nom_usu varchar(15),
apel_usu varchar(30),
foto_usu image
)
Insert into usuarios values('Usu1','Jean Carlos','Lizano Arroyo',null)
Insert into usuarios values('Usu2','Carlos','Liza oyo',null)
Insert into usuarios values('Usu3','Pedro','Lizano Arro',null)
Insert into usuarios values('Usu4','Jose','Lizano royo',null)
Insert into usuarios values('Usu5','Luis','Lio Arroyo',null)
Insert into usuarios values('Usu6','Miguel','no Arroyo',null)
select * from usuarios
Luego en Vb6.0 en el form1
claro no en el control adodc1 le tienes q dar en sus propiedades
el Adodc1.ConnectionString pero creo que eso ya sabes si tienes alguna duda avisa ok o si sale algun error
en el diseño en Propiedades de la cajas de texto pones
del text1
DataSource=adodc1
DataField=cod_usu
del text2
DataSource=adodc1
DataField=nom_usu
del text3
DataSource=adodc1
DataField=apel_usu
del Image1
DataSource=adodc1
DataField=foto_usu
Option Explicit
Dim sRutaImg As String
Dim Data() As Byte
Private Sub Command1_Click()
Adodc1.Recordset.MoveLast
Adodc1.Recordset.AddNew
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Image1.Picture = Nothing
End Sub
Private Sub Form_Load()
Image1.Stretch = True
End Sub
Private Sub Command2_Click()
Adodc1.Recordset.Fields(0) = Text1.Text
Adodc1.Recordset.Fields(1) = Text2.Text
Adodc1.Recordset.Fields(2) = Text3.Text
Adodc1.Recordset.Fields(3) = Data
Adodc1.Recordset.Update
Adodc1.Recordset.MoveFirst
End Sub
Private Sub Command3_Click()
Adodc1.Recordset.CancelUpdate
Adodc1.Recordset.MoveFirst
End Sub
Private Sub convertir_imagen(sImg As String)
On Error GoTo error_Sub
Dim fLen As Long
Open sImg For Binary Lock Read As 1
fLen = FileLen(sImg)
ReDim Data(fLen) As Byte
Get #1, , Data
Close
Exit Sub
error_Sub:
MsgBox Err.Description, vbCritical
End Sub
Private Sub Image1_DblClick()
CommonDialog1.DialogTitle = "Seleccione una imagen"
CommonDialog1.Filter = "Imagenes|*.jpg"
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> "" Then
sRutaImg = CommonDialog1.FileName
Image1.Picture = LoadPicture(sRutaImg)
convertir_imagen sRutaImg
End If
End Sub
pero como dicen arriba es mejor ponerlo en una carpeta y de ahi jalarlos para q la bd no se llene rapidamente
suerte
saludos
-
Ok Comprendido!!!, pero queria guardarlas en la BD :'(
No almacenes imagenes en BD, no es recomendable. Pero de igual manera ya es desición tuya. Creeme, tengo muchos años con esto y lo mejor es hacerlo como te dije anteriormente.
Una gran anecdota, me pidieron un software de digitalización de documentos. Donde la empresa requiere escanear documentos fisicos sea pasaporte, carnet o cedula de identidad, partida o acta de nacimiento, documento de vehiculo, etc y asignarlos o referenciarlos al respectivo cliente. Te imaginas si guardo todo eso en una BD donde tengo una cartera de cliente de 20mil registros y donde la lista de documentos por cliente supera los 300? Se vuelve una locura y no creo que llegue al mes la BD. Su tamaño sería monstruoso. Por tal motivo se crearon directorios en un Disco Duro que servía de Exclavo de 1TB y se desarrollo el software donde solo almacenabamos el nombre del archivo, mejor dicho el nombre de las imagenes. La gran respuesta del cliente fue, luego de usar el software:
El sistema es excelente. Su motor de busqueda es rápido. Puedo visualizar toda la información en segundos.
Crees que hubiese sido la misma respuesta de haber almacenado las imagenes en la BD?
Saludos, y sigue adelante aún queda camino por recorrer... Aquí siempre encontrarás apoyo...!
-
bueno creo que el tema ya lo he discutido un par de veces con ssccaann43, no me acuerdo si fue en este foro o en elhacker.net, que parece que somos los unicos que manejamos el tema de base de datos, yo tambien te puedo dar mi opinion.
obviamente en el ejemplo de ssccaann43, seria un kamikaze si se hubiera puesto a guardar esa cantidad de imagenes en la base de datos, entre pasaporte, cedula..etc...y todo eso para cada cliente que eran 20 mil aprox...obviamente en este caso guardarlo en base de datos seria pesimo.
pero que pasa si no es asi y no tenes que poner esa cantidad de imagenes en la base...otra es la historia.
antes decir que todo esto tambien depende de muchos factores, por ejemplo la velociadad de la pc que ejecute el software, no es lo mismo una de una maquina de 1 procesador que una Quad Core.
tambien depende la forma en que lo programas y el motor de bases de datos que uses, yo por comodidad uso SQL Server 2005 que digamos hoy en dia es el "standart". y usaria ADO desde codigo que es lo mejor (ya se ha dicho mil veces en el foro) , antes que usar ADODC.
yo hice un software que cada "cliente" (en realidad no son clientes, pero imaginemos que lo son) puede guardar su foto, y esto lo ha pedido una empresa donde la misma cuenta con expertos, y sin embargo lo pidieron obligadamente, sabiendo las consecuencias que podia traer si es tan malo guardar las imagenes en la base, lo pidieron y se hizo.
uno tambien puede hacer que el usuario seleccione imagenes de determinado tamaño, eso para evitar el crecimeinto de la base, supongamos que tenemos el exagerado (con respecto al que yo estoy comentando ya que esta entre 4000 y 6000 registros) ejemplo de 20 mil registros del sistema de ssccaann43, supongamos que ponemos una foto de 10 kb que es como la foto de un documento de identidad, la base tendria un crecimiento de aprox 200 MB...lo cual si uno se pone a pensar es algo bastante grande, aparte imaginemos que tenemos las fotos de los 20 mil clientes, cosa que no creo, pero con el mio que tiene 4000 eso seria 50 MB, lo cual la verdad no me parece nada alto el tamaño, pensar que existen bases de datos de GB de tamaño.
por eso como veras esto depende de muchas cosas, depende de lo que hace tu sistema...grabar imagenes en al base de datos tiene sus ventajas y desventajas, pero creo que uno puede usarlo tranquilamente si sabe cuando usarlo realmente, ya que creo que por algo lo crearon, sino no existiria.una de las simples ventajas es que uno al hacer backup tiene todas las imagenes dentro...el tema de guardarlas fuera es si alguien modifica o elimina las fotos puede hacer un desastre, en cabmio si uno lo maneja desde el sistema, tiene mas "control" sobre las modificaciones...bueno esas son algunas ventajas, pero como te dije depende de lo que queres, y aun asi el sistema que yo comente funciona perfecto aun guardando imagenes en al base
, y no se percibe diferencia en si tiene imagen o no.pero como te dije todo "depende" , por eso vos vas a saber que hacer.
saludos.
-
Excelente seba, mejor no puede ser... El tiene ya 2 opiniones de expertos que han trabajado con dicho requerimiento...! Buenisimo...!
-
De verdad muchas gracias :o
He tenido un poco de inconvenientes en los proyectos por que me los piden con imagenes desde el datareport por que no se por que no puedo utilizar el crystal report, y la base de datos, al principio utilizaba access para crear las bases de datos ahora estoy utilizando sql server 2000 por que no he podido descargar el 2005 pero creo que tendre que hacerlo.
Les cuento estoy teniendo problemas por que estoy generando un sistema para colegios que me pide que lleve el control de los estudiantes por imagenes y me tire a crear una carpeta donde pego la foto por codigo y solo enlaso la dirección para que la base de datos no pese mucho pero no me ha subido de 2 megas la base de datos y pues les cuento cada año un colegio promedio aqui tiene 300 estudiantes por jornada y son 3 jornadas digamos 1000 estudiantes por total, cada año, eso significa que son 5000 en 5 años, y tener todas esas fotografias en una carpeta ami se me vuelve un poco tedioso por aquello de que si borran una foto ya no cargo o algo
si quisiera manejarlo en la base de datos y ahora con la opinion de sebas me parece que lo voy a volver a intentar aver como me va.
Aunque para entregar el proyecto voy a utilizar la alternativa que me dio SSCCAANN por que se escucha rapida, pero lo intentare solo como referencia.
DESDE YA MUCHAS GRACIAS Y SCCAANN Y SEBAS SON UNOS MOUSTRUOS ;)
-
Puedes armarte con la alternativa de sebas ya que podrías soportar una cierta cantidad de alumnos y solo almacenarías una foto x alumno... Y en tal caso de que te encuentres con algo inmenso pues realizas el levantamiento de información y allí determinarás que opción usar...
-
Justo esta es mi duda, estoy portando un sistema erp que hice en vb a Python pero mejorandolo.... tengo clientes con hasta 100.000 articulos y hasta ahora usaba el metodo de scann, pero si tienen mas de una sucursal, hay que instalar servidores de archivos, para poder subir, borrar las fotos, mas code y mas procesos, por eso decidi meter las fotos en la db, y abrir las consultas a la tabla sin el campo foto, y en otro thead abrir las fotos, para no colgar el sistema mientras se baja, la foto, lo voy a probar... y dsp le cuento, lo estoy programando ahora...
saludos
-
Mira yo por lo general tambien lo hago con el metodo de SSCCAANN pero tengo un sistema de restaurantes que estoy haciendo y necesite meter las imagenes en la base de datos... investigando un poco logre tener un par de fuentes que me ayudaron a armar este modulo
Option Explicit
Private Pic As IPictureDisp
Public Function ImportImagen(Item As ADODB.Field, Pic As Image)
Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream
Stream.Type = adTypeBinary
Stream.Open
Stream.Write Item.Value
Stream.SaveToFile App.Path & "\temp", adSaveCreateOverWrite
Pic.Picture = LoadPicture(App.Path & "\temp")
End Function
Public Function ImportImagen2(nombre As String, Item As ADODB.Field, Pic As PictureBox)
Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream
Stream.Type = adTypeBinary
Stream.Open
Stream.Write Item.Value
Stream.SaveToFile App.Path & "\" & nombre, adSaveCreateOverWrite
Centrar_Imagen Pic, App.Path & "\" & nombre
Kill App.Path & "\" & nombre
End Function
Public Function ImportFileImagen(Item As ADODB.Field, clave As ADODB.Field)
Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream
Stream.Type = adTypeBinary
Stream.Open
Stream.Write Item.Value
Stream.SaveToFile App.Path & "\" & clave, adSaveCreateOverWrite
End Function
Public Function ImportReportImagen(Item As ADODB.Field)
Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream
Stream.Type = adTypeBinary
Stream.Open
Stream.Write Item.Value
Stream.SaveToFile App.Path & "\logocolegio", adSaveCreateOverWrite
End Function
Public Function ExportImagen(urlimg As String, Item As ADODB.Field)
On Error GoTo errimg
Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream
Stream.Type = adTypeBinary
Stream.Open
Stream.LoadFromFile urlimg
Item.Value = Stream.Read
Exit Function
errimg:
End Function
Sub Centrar_Imagen(Objeto As Object, Path_Imagen As String)
On Error GoTo ErrSub
Dim Pos_x As Single 'Posición horizontal de la imagen
Dim Pos_y As Single 'Posición vertical de la imagen
Dim Ancho_IMG As Single 'Ancho de la imagen
Dim Alto_IMG As Single 'Alto de la imagen
Dim Ancho_Obj As Single 'Ancho en Pixeles del objeto contenedor
Dim Alto_Obj As Single 'Alto en Pixeles del objeto contenedor
Dim old_Scale As Single 'Para lamacenar el ScaleMode del objeto
Static old_Path As String
If old_Path <> Path_Imagen Then
Set Pic = LoadPicture(Path_Imagen)
End If
With Objeto
.AutoRedraw = True
.Cls
old_Scale = .ScaleMode
.ScaleMode = vbPixels
'Pasa el ancho y alto de la imagen a Pixeles
Ancho_IMG = .ScaleX(Pic.Width, vbHimetric, vbPixels)
Alto_IMG = .ScaleY(Pic.Height, vbHimetric, vbPixels)
Ancho_Obj = .ScaleWidth
Alto_Obj = .ScaleHeight
If Ancho_IMG > Ancho_Obj Then
Alto_IMG = Alto_IMG * Ancho_Obj / Ancho_IMG
Ancho_IMG = Ancho_Obj
End If
If Alto_IMG > Alto_Obj Then
Ancho_IMG = Ancho_IMG * Alto_Obj / Alto_IMG
Alto_IMG = Alto_Obj
End If
' Posición X e Y donde dibujar con PaintPicture
Pos_x = (Ancho_Obj - Ancho_IMG) / 2
Pos_y = (Alto_Obj - Alto_IMG) / 2
End With
'Dibuja la imagen
Objeto.PaintPicture Pic, Pos_x, Pos_y, Ancho_IMG, Alto_IMG
'Restaura el ScaleMode
Objeto.ScaleMode = old_Scale
old_Path = Path_Imagen
Exit Sub
'Error
ErrSub:
MsgBox Err.Description, vbCritical
End Sub
por el momento a mi me funciona muy bien!!!!!
-
Saludos,
Quisiera consultarles algo, tengo una base de datos MSSQL 2012 y quiero guardar las rutas de una imagenes en una tabla, la ruta apunta a una carpeta del disco duro,como puedo insertar el vinculo y verlo desde php e insertarlo en un archivo de excel con la libreria phpexcel?
les agradezco mucho su ayuda.