为什么?????为什么?????帮帮我!!!!!帮帮我!!!!!RecPicture.update时出错.......错误提示为:实时错误'-2147217887(80040e21)'!!!!有分散散

spruce 2002-10-10 04:33:38
调试过多少次.总是在RecPicture.update时出错.......
在win98下也是.win2000也一样.
错误提示为:
实时错误'-2147217887(80040e21)'

为什么?????为什么?????为什么?????为什么?????为什么?????为什么?????
为什么?????为什么?????为什么?????为什么?????为什么?????为什么?????
帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!
帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!帮帮我!!!!!
Function SavePicture(ByVal StrFileName As String, ByVal DBConnect As ADODB.Connection, ByVal StrTable As String, ByVal Barcode As String) As Integer
'Expression by the values returned
'0 Pictrue saved is ok
'1 Picture is not exist
'2 Size of the exist Picture is 0
'3 Unknow
'On Error GoTo OnErr
Dim i As Integer
Dim lngFileLen As Long
Dim Chunks As Integer
Dim intFile As Integer
Dim Fragment As Integer
Dim Chunk() As Byte
Dim RecPicture As New ADODB.Recordset
Dim ChunkSize As Integer
ChunkSize = 32767
If Dir(StrFileName) = "" Then
SavePicture = 1
Exit Function
End If
intFile = FreeFile
Open StrFileName For Binary Access Read As intFile
lngFileLen = LOF(intFile) ' 文件中数据长度
If lngFileLen = 0 Then
Close intFile
SavePicture = 2
Exit Function
End If

Barcode = LTrim(Trim(Barcode))
StrTable = "Select Barcode,Picture,Type From " & StrTable & " Where Barcode like '" & Barcode & "'"
RecPicture.Open StrTable, DBConnect, adOpenStatic, adLockOptimistic
If RecPicture.EOF Then
RecPicture.AddNew
RecPicture.Fields("Barcode") = Barcode
End If

i = InStrRev(StrFileName, ".")
If i <> 0 Then
RecPicture.Fields("Type") = Mid(StrFileName, i + 1)
Else
RecPicture.Fields("Type") = ""
End If

Chunks = lngFileLen \ ChunkSize
Fragment = lngFileLen Mod ChunkSize
ReDim Chunk(Fragment)
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For i = 1 To Chunks
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
Next i
Close intFile
'错误出在这...
RecPicture.Update '错误出在这...
'错误出在这...
RecPicture.Close

SavePicture = 0
Exit Function

OnErr:

SavePicture = 3
Exit Function

End Function

但是:
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
RecPicture.Update
ReDim Chunk(ChunkSize)
For i = 1 To Chunks
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
RecPicture.Update
Next i

这样程可以更新可以执行.不会出错.
但存入的是最后一次的.RecPicture.Fields("Picture").AppendChunk Chunk()



...全文
36 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
spruce 2002-10-15
  • 打赏
  • 举报
回复
非常感谢:以上各位大哥的相助!
spruce 2002-10-15
  • 打赏
  • 举报
回复
非常感谢:以上各位大哥的相助!
我知道原因了。。

这个函数用在sql server不会出错。
而用在mdb access 3.51的数据库时就会出错。。。。。。。。
thinkeasy 2002-10-14
  • 打赏
  • 举报
回复
Chunks = lngFileLen \ ChunkSize
Fragment = lngFileLen Mod ChunkSize
ReDim Chunk(Fragment)
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For i = 1 To Chunks
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
Next i
不明白你这段为什么这么写,你可以把整个文字读到一个数组里面呀

ReDim Chunk(LOF(intFile))
Get intFile, , Chunk()
RecPicture.Fields("Picture").AppendChunk Chunk()
w18ily 2002-10-14
  • 打赏
  • 举报
回复
楼主:
Close intFile
'错误出在这...
RecPicture.Update '错误出在这...
'错误出在这...
RecPicture.Close
这样试试:
RecPicture.Update '错误出在这...
'错误出在这...
Close intFile
'错误出在这...
RecPicture.Close

我没怎么用你这种方法,现在都用的是Stream!
因为我看你的后面好象是说已经关闭,不能更新的意思!
后面在循环内更新是没问题的!
你试试!

w18ily 2002-10-14
  • 打赏
  • 举报
回复
在 ActiveX Data Objects (ADO) 2.5 中引入的 Stream 对象可以用来大大简化编写访问和修改 SQL Server 中的 BLOB 数据的代码。 以前版本的 ADO [ 2.0、2.1 和 2.1 SP2 ] 则需要小心使用 Field 对象的 GetChunk 和 AppendChunk 方法,才能将固定大小的大型数据块中的 BLOB 数据写入 BLOB 列(或从中读取)。 由于 ADO 2.5 的出现,该方法有了可以替代的方案。 本文包含相应的代码示例,这些示例演示了如何使用 Stream 对象来为如下常见任务进行编程:

将存储在 SQL Server Image 列的数据保存到硬盘的文件中。
将 .gif 文件的内容移到 SQL Server 表的 Image 列。



更多信息
下面的代码示例所针对的数据存储在 SQL Server 7.0 pubs 示例数据库的 pub_info 表中。 您需要修改 ADO 连接字符串,使之指向您安装的 SQL Server。

示例 1: 将 SQL Server Image 列中的数据保存到硬盘文件中


该示例代码将打开在 pubs 数据库的 pub_info 表中的记录集,并将存储在第一条记录 logo 列中的二进制图像数据保存到硬盘文件中,如下所示:
新建一个标准 EXE Visual Basic 工程。


在工程菜单上,单击选择引用,然后设置一个到 Microsoft ActiveX Data Objects 2.5 Object Library 的引用。


将 CommandButton 控件放在 Form1 上。


在该窗体的常规声明段中作如下声明:


Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mstream As ADODB.Stream
将下面的代码剪切并粘贴到添加到该窗体的 CommandButton 所对应的 Click 事件中:


Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;data Source=<name of your SQL Server>;
Initial Catalog=pubs;User Id=<Your Userid>;Password=<Your Password>"

Set rs = New ADODB.Recordset
rs.Open "Select * from pub_info", cn, adOpenKeyset, adLockOptimistic

Set mstream = New ADODB.Stream
mstream.Type = adTypeBinary
mstream.Open
mstream.Write rs.Fields("logo").Value
mstream.SaveToFile "c:\publogo.gif", adSaveCreateOverWrite

rs.Close
cn.Close
保存并运行该 Visual Basic 工程。


单击 CommandButton,即可将第一条记录的 logo 列所包含的二进制数据保存到文件 c:\publogo.gid 中。请用资源管理器找到并打开该文件,以查看所保存的图像。

该示例中的代码声明了一个 ADODB Stream 对象,并将它的 Type 属性设置为 adTypeBinary,以表示将使用该对象处理二进制数据。 然后,通过调用 Stream 对象的 Write 方法,存储在 pub_info 表第一条记录的 logo 列中的数据被写出到 Stream 对象中。 现在,Stream 对象包含了二进制数据,该二进制数据是通过调用该对象的 SaveToFile 方法并传入文件的路径保存到文件中的。 作为第二个参数被传入的常量 adSaveCreateOverWrite 则导致 SaveToFile 方法覆盖指定的文件(如果它已经存在)。


示例 2: 将以 .gif 文件格式存储的图像传输到 SQL Server 表的 Image 列


该示例代码将通过覆盖 pub_info 表的当前内容,将一个以 .gif 文件格式存储的图像保存到该表的第一条记录中,如下所示:
新建一个标准 EXE Visual Basic 工程。


在工程菜单上,单击选择引用,然后设置一个到 Microsoft ActiveX Data Objects 2.5 Object Library 的引用。


将 CommandButton 按钮放在 Form1 上。


在该窗体的常规声明段中作如下声明:


Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mstream As ADODB.Stream
将下面的代码剪切并粘贴到添加到该窗体的 CommandButton 所对应的 Click 事件中:


Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;data Source=<name of your SQL Server>;
Initial Catalog=pubs;User Id=<Your Userid>;Password=<Your Password>"

Set rs = New ADODB.Recordset
rs.Open "Select * from pub_info", cn, adOpenKeyset, adLockOptimistic

Set mstream = New ADODB.Stream
mstream.Type = adTypeBinary
mstream.Open
mstream.LoadFromFile "<path to .gif file>"
rs.Fields("logo").Value = mstream.Read
rs.Update

rs.Close
cn.Close
保存并运行该 Visual Basic 工程。


单击 CommandButton 运行该代码,即可将 .gif 文件的内容以数据流的方式传输到 ADO Stream 对象中,并将 Stream 中的数据保存到记录集内第一条记录的 logo 列。


请使用示例 1 中的代码,确认 logo 列中的图像已被修改。

spruce 2002-10-12
  • 打赏
  • 举报
回复
谢谢你的解答?
但为什么RecPicture.Update会出错。。。?
MarGo 2002-10-12
  • 打赏
  • 举报
回复
读:
While Not G_Rs1.EOF
Set L_rs = G_Conn.Execute("select * from Au_vehicles where Auno='" & G_Rs1!c_hphm & "' order by inrow asc")
While Not L_rs.EOF
If stm.State <> adStateClosed Then
stm.Close
End If
stm.Type = adTypeBinary
stm.Open
stm.Write L_rs.Fields("PageN").GetChunk(L_rs.Fields("PageN").ActualSize)
stm.SaveToFile TmpPath & "\tmp" & G_Rs1!c_hphm & L_rs!inrow & ".jpg", IIf(Len(Trim(Dir(TmpPath & "\tmp" & G_Rs1!c_hphm & L_rs!inrow & ".jpg", vbNormal + vbHidden))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist)
Dim st As String
st = "insert into Au_temp values ('" & L_rs!Auno & "','" & TmpPath & "\','" & "tmp" & G_Rs1!c_hphm & Trim(Str(L_rs!inrow)) & ".jpg'," & L_rs!inrow & ")"
G_Conn.Execute (st)
L_rs.MoveNext
Wend
G_Rs1.MoveNext
Wend
MarGo 2002-10-12
  • 打赏
  • 举报
回复
也许正如楼上的说的
我用这种方法
写引用ADO2.5以上

Dim Auno As String '车辆号牌号码
Dim Row As Long '页码号
Dim FileName As String '
Dim stm As New ADODB.Stream '二进制流
Timer1.Enabled = False
While Not L_rs.EOF
Auno = L_rs!Auno
Row = L_rs!inrow
FileName = L_rs!fpath & L_rs!fname
If stm.State <> adStateClosed Then
stm.Close
End If

stm.Type = adTypeBinary
stm.Open

stm.LoadFromFile FileName
G_Rs.AddNew
G_Rs.Fields("Auno") = Trim(Auno)
G_Rs.Fields("InRow") = Row
G_Rs.Fields("APos") = Pos
G_Rs.Fields("PageN").AppendChunk stm.Read
G_Rs.Update
stm.Close
L_rs.MoveNext

Wend
Set stm = Nothing
Animation1.Stop
lionwx 2002-10-10
  • 打赏
  • 举报
回复
图片的更新不可以一次更新多个,只能以更新一个
yjmking 2002-10-10
  • 打赏
  • 举报
回复
事不是要movenext?

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧