VB高手请进,从ACCESS读取图片显示的问题

作者&投稿:由牧 (若有异议请与网页底部的电邮联系)
vb中读取access,rnd产生了假随机,请问怎么改进?!~

加上randomize这句

你的这些DataGrid最好做成控件数组,而且其index要和sstab的tab号一一对应。另外界面上再放一个adodc控件,和数据库连接好,并且设为不可见的。这样就简单了:

Private Sub SSTab1_Click(PreviousTab As Integer)
Adodc1.RecordSource = "select * from " & SSTab1.Caption
Adodc1.Refresh
Set DataGrid1(SSTab1.Tab).DataSource = Adodc1
End Sub

问题已经解决了。

Dim pic() As Byte = CType(tbl.Rows(0).Item("img1"), Byte())
Dim mem As New MemoryStream(pic, &H9A, pic.Length - &H9A)
pic1.Image = Image.FromStream(mem)

如上就OK了, 偏移量 GIF 是 9A, BMP 是 4A

---------------------------------------

确认: 你的图片是如何存入ACCESS的?

那就对了,这就是问题所在。

ACCESS本身会给OLE字段添加额外的附加信息,所以显示错误。

解决方法请HI 联系我

找了个例程,加了些注释,学习下
原理,是先把二进制对象读出来,生成临时图片文件,再绑定到控件就可以了。
Dim Constr As String 'ODBC路径
Dim Filename As String '图片文件名
Const BLOCKSIZE = 4096 '每次读写块的大小
Dim ADOCon As New ADODB.Connection 'ADODB Connection对象
Dim ADORst As New ADODB.Recordset 'ADODB Recordset对象
Dim ADOFld As ADODB.Field 'ADODB Field对象
Public Function SaveFileToDB(ByVal Filename As String, dbField As ADODB.Field, Optional PackageSize As Long = 8192&) As Long
On Error GoTo errHandle
Dim lngActualSize As Long, lngCurrentSize As Long
Dim bTemp() As Byte
Dim hFile As Long
Dim i As Integer
Dim lChunkCount As Long
Dim lChunkRemainder As Long
lngActualSize = FileLen(Filename)
lngCurrentSize = 0
If lngActualSize <= 0 Then
Err.Raise ERR_SIZE_EQU_OR_LESS_ZERO, "writeFileToDB"
End If
'读取文件内容
hFile = FreeFile()
Open Filename For Binary As hFile
ReDim bTemp(PackageSize) '临时存贮块
lChunkCount = LOF(hFile) \ PackageSize '取块数
lChunkRemainder = LOF(hFile) Mod PackageSize
If lChunkRemainder > 0 Then lChunkCount = lChunkCount + 1
For i = 1 To lChunkCount
Get hFile, , bTemp '从文件中取出一块
dbField.AppendChunk (bTemp) '将块写入字段中
Next
Close #1
SaveFileToDB = 0
Exit Function
errHandle:
SaveFileToDB = Err.Number
End Function
Public Function GetFileFromDB(dbField As ADODB.Field, vdata As Variant, Optional PackageSize As Long = 8192&) As Long
' Optional ByVal SaveAs As String = "",
'如果SaveAs为空串则保存在vData这个变体类型中,否则保存在文件中
On Error GoTo errHandle
Dim i%, lngActualSize As Long, lChunkCount As Long
Dim vTemp As Variant, bTemp() As Byte
Dim hFile As Long
lngActualSize = dbField.ActualSize
If lngActualSize <= 0 Then
Err.Raise ERR_SIZE_EQU_OR_LESS_ZERO, "getFileFromDB"
End If
lChunkCount = lngActualSize \ PackageSize
If (lngActualSize Mod PackageSize <> 0) Then
lChunkCount = lChunkCount + 1
End If
hFile = FreeFile()
'Open "" & App.Path & "" & " \Temp.Temp" For Binary As hFile
Open "" & App.Path & "" & "\Temp.Temp" For Binary As hFile
For i = 1 To lChunkCount
bTemp = dbField.GetChunk(PackageSize)
Put #hFile, , bTemp
Next
Close
GetFileFromDB = 0
Exit Function
errHandle:
GetFileFromDB = Err.Number
End Function
Private Sub cmdGet_Click()
'重新打开记录集,刷新记录
Set ADORst = Nothing
Set ADOCon = Nothing
ADOCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" & "\照片库.mdb;Persist Security Info=False"
ADORst.Open "select * from Info Where Name='" & UserNames.Text & "'", ADOCon, adOpenDynamic, adLockOptimistic
'打开一个ADO动态集 表名为table
If ADORst.EOF = False Then
Else
MsgBox "没有这条记录", vbCritical, "提示:"
Exit Sub
End If
Set Adodc1.Recordset = ADORst '将动态集赋给ADO控件
Set ADOFld = ADORst("Photo") '给ADODB.Field对象赋值
Call GetFileFromDB(ADOFld, vdata) '调用字程序,给第三个字段(image)赋值
Image1.Picture = LoadPicture("" & App.Path & "" & "\Temp.Temp") '从临时文件加载图片
Kill ("" & App.Path & "" & "\Temp.Temp") '删除临时文件
End Sub
Private Sub cmdPreView_Click()
'显示打开文件的公用对话框,选择需要加入数据库的图片
CommonDialog1.Filter = "图片文件|*.bmp;*.ico;*.jpg;*.gif;*.jpeg"
CommonDialog1.ShowOpen
Filename = CommonDialog1.Filename
Text1.Text = CommonDialog1.Filename
Image0.Picture = LoadPicture(Filename) '预览图片
End Sub
Private Sub cmdSave_Click()
Set ADORst = Nothing
Set ADOCon = Nothing
ADOCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" & "\照片库.mdb;Persist Security Info=False"
ADORst.Open "select * from Info Where Name='" & txtAddName.Text & "'", ADOCon, adOpenDynamic, adLockOptimistic
'打开一个ADO动态集 表名为table
Set Adodc1.Recordset = ADORst '将动态集赋给ADO控件
If ADORst.EOF = True Then
ADORst.AddNew '新增记录
ADORst("Name").Value = txtAddName.Text '给动态集的第一个字段赋值
'ADORst("ID").Value = txtAddID.Text '给动态集的第二个字段赋值
Set ADOFld = ADORst("Photo") '给ADODB.Field对象赋值
Call SaveFileToDB(Filename, ADOFld) '调用字程序,给第三个字段(image)赋值
ADORst.Update
Else
MsgBox "已有此条记录", vbCritical, "提示:"
End If
End Sub
Private Sub cmdUpdate_Click()
'重新打开记录集,刷新记录
ADORst.Close
ADOCon.Close
Set ADORst = Nothing
Set ADOCon = Nothing
ADOCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" & "\照片库.mdb;Persist Security Info=False"
ADORst.Open "select * from Info", ADOCon, adOpenDynamic, adLockOptimistic
Set Adodc1.Recordet = ADORst
End Sub
Private Sub Form_Unload(Cancel As Integer)
'记得关闭打开的数据库,释放资源
Set ADORst = Nothing
Set ADOCon = Nothing
End Sub

CType是转成字节码,你看错了吧,好像是CByte..有点忘了,ACCESS好像不支持手动保存图像,思路是对通过字节流读取图片,但是最好还是不要存数据库了,access存图片字节数据有限,经常只能存很小的图片,大的图片存不下

我有很多年的ACCESS2007与VB的工作了,从来就没有把图片载入数据库,体积过大,备份数据库很慢,从来都是用动态路径,做一个资源库,与连接上去,


VBA高手请进.帮忙解释一下代码
'这个程序是在对数据表进行操作,T 在这段代码中尚未使用到.'这段代码写入数据的效率太低,数据量较大时写入速度会很慢.如果能看到完整代码和数据有优化的可能,效率会非常的高.Sub BQ()Dim Myr%, x%, n%, y%, m%, o%, s%, T%, ac%, W%, ai%, P% '定义若干Integer变量 Dim Sht1...

CAD高手请进
2008可以绘制三维螺旋线(类似弹簧),等等 见意你有条件,还是换一个版本。附简命令 3A, *3DARRAY 3DO, *3DORBIT 3F, *3DFACE 3P, *3DPOLY A, *ARC AC, *BACTION ADC, *ADCENTER AA, *AREA AL, *ALIGN AP, *APPLOAD AR, *ARRAY -AR, *-ARRAY...

一道分式方程题,高手请进
1\/b + 1\/c+a = 1\/3 1\/c + 1\/a+b = 1\/4 通分,整理一下:(a+b+c)\/[a(b+c)]=1\/2 (a+b+c)\/[b(a+c)]=1\/3 (a+b+c)\/[c(a+b)]=1\/4 a(b+c)\/(a+b+c)=2 b(a+c)\/(a+b+c)=3 c(a+b)\/(a+b+c)=4 ab+ac=2(a+b+c)………(1)ab...

台球高手请进(关于球杆的问题)
从照片上看。这根杆是有皮头的。因为铜箍和木头应该是平行的。既然高于铜箍,你说应该是什么?但你在补充里非常肯定那不是皮头。那么在我理解只有一种情况:那就是这是根新杆,没有打过。你朋友送你的时候嘱咐你一定要换皮头。因为新杆在出厂的时候都是粘着保护头的。无论是不是这种情况,你要换...

数学高手请进!
首先我认为 凯恩血蹄怒风 的答案不太正确 我的答案正在制作中 答案1,点图放最大看,在上面 答案2.画出梯形的2个高,这两个高是两个直角三角形的高 根据A方+B方=C方的原理 可以列出个方程式 方程里面 X+Y=1, 并且有 9-(1+x)^2=16-(1+y)^2 (^2 就是2次方)然后解这个方程式 ...

关于超频,高手请进
主板:FOXCONN(是富士康吧) 945PL7AC我想把CPU和显卡都超上去,但是听说超频是要看BIOS,怎么看BIOS支不支持呢??请高手指点并带详细步骤,谢谢如果能超,超多少...[b]硬超频:[\/b]现在采用纯跳线方式超频的主板已经没有了,代替它们的都是采用DIP开关这样的形式,而现在的CPU都是所频的,倍频设置都是主板自动侦测,因此...

数学高手请进
都能用这种算法。只需用十位数乘以比它大一的数,加上后两位数相乘即可。如果后两位数相乘只有一位时,前面要补0。如31*39=?先用3乘以比它大一的数4,为12,加上后两位数相乘1*9=9,只有一位,前面补0,为09,所以31*39=1209。它的原理是:假若这两个两位数分别为ab=10a+b,ac=10a+c...

一道数学题,高手请进
因为ac那条的三角形是锐角。另一条是钝角。锐角高,拉得长。钝角低,拉得短。

数学高手请进!
F(-c,0)AF=a+x1e BF=a+e CF=a+x2e AF+CF=2BF x1e+x2e=2e (x1+x2)\/2=1 设AC中点M Mx=1 My=(y2+y1)\/2 AC垂直平分线l1: y-My=[(y2-y1)\/(x2-x1)](x-Mx)y-(y2+y1)\/2=[(y2-y1)\/(x2-x1)](x-1)因为椭圆的对称性 A'(x1,-y1)A‘F=AF A’F+CF...

高手请进vlan问题
vlan 之间能互相访问吗 我是个电脑白痴 请高手解决下 要是好再加分以前交换机上没有划分vlan 使交换机负担太大 现在想要把它的压力减小 要给它划分几个...1defaultEnabled1,6-16,22-24,AUI,A,B 2accontingEnabled2-5 3marketingEnabled17-22 1002fddi-defaultSuspended 1003token-ring-defauSuspended 1004...

武穴市15038522671: VB高手请进,从ACCESS读取图片显示的问题 -
舟苛盐酸: 问题已经解决了.Dim pic() As Byte = CType(tbl.Rows(0).Item("img1"), Byte()) Dim mem As New MemoryStream(pic, &H9A, pic.Length - &H9A) pic1.Image = Image.FromStream(mem) 如上就OK了, 偏移量 GIF 是 9A, BMP 是 4A--------------------------------------- 确认: 你的图片是如何存入ACCESS的? 那就对了,这就是问题所在.ACCESS本身会给OLE字段添加额外的附加信息,所以显示错误.解决方法请HI 联系我

武穴市15038522671: VB怎么样读取ACCESS里的图片?
舟苛盐酸: 那就要看你数据库是以什么方式存的数据. 如果数据库里面存的是图片的路径,那就直接指向图片所在路径就可以了; 如果你是以byte字节来存的,那就要通过IO流的方式来读取.

武穴市15038522671: 求助用VB连接Access数据库来显示图片
舟苛盐酸: 你好,连接数据库的过程是比较简单的,可以用data控件或者是adodc控件,建议你单独弄一个文件夹来放图片. 利用fso对象遍历目录将图片名称写入数据库.然后你再分别为他们添加说明. 不建议你将图片文件存入数据库的,这样会增加数据库的大小.

武穴市15038522671: 怎样用vb 的image控件读取ACCESS中以二进制保存的图片 -
舟苛盐酸: 1、从数据库中显示所需要的图片第一步首先打开数据库,看有没有要查找的内容,有则继续执行,没有就退出 RS.Source = "select * from Info Where Name='" & sparaName &"';"RS.ActiveConnection = "UID=;PWD=;DSN=TestDB;"RS....

武穴市15038522671: 关于VB 6 怎样读取Access数据库中的图片(ole类型数据)和调用chn帮助文件 -
舟苛盐酸: 给你个示例,下面是读取数据库中的二进制数据,并存放到指定的地方的,读取图片的,应该差不多 strSQL = "select * From CodeFile where CodeID=" & ID Rs.Open strSQL, Conn, 1, 3 While Not Rs.EOF FileName = Rs("FileName").Value ...

武穴市15038522671: vb中怎么access从数据库中读取数据(包括图片的路径数据)并显示成一个表格的形势 类似Datagrid那样? -
舟苛盐酸: var mycars = new Array() Composite comp2 = new Composite("Composite XY"); comp2.Add(new Leaf("Leaf XYA")); comp2.Add(new Leaf("Leaf XYB")); root.Add(comp2); root.Add(new Leaf("Leaf C"));

武穴市15038522671: VB 6 中 怎么读取Access数据库中的图片(数据类型OLE) -
舟苛盐酸: 把那个IMAGE控件的属性直接射应到那个 ACCESS控件 就自然出来了

武穴市15038522671: vb.net+access数据库:怎样实现图片的读取与保存
舟苛盐酸: 首先 ACCESS 的表结构,测试方便的愿意只用了两个字段 表名table1字段 1 ID 数字型2 PIC OLE 对象 以下代码Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim pic As ...

武穴市15038522671: 怎么用vb 的image控件读取access表中的二进制图像? 你知道的简便方法?谢谢 -
舟苛盐酸: dq.Open "Select * from picture where id like'" & pa & "'", myconn, 1, 2 Set Image1.DataSource = Nothing Set Image1.DataSource = dq Image1.DataField = "pic" dq.Close 你的二进制图像要先存入ACCESS表中,命名picture,id可以用自动...

武穴市15038522671: VB,在access中存储图片路径、读取图片到picturerbox方法 -
舟苛盐酸: image字段是用于储存二进制流Private m_objPicture As StdPicturePublic Function getSignaturePicture() As StdPicture '---获得用户对应的签字图片 Dim objSQL As CSQL '---存储临时文件名 Dim TempFile As String Dim fso As New Scripting....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网