求救!关于数据库存储图片!急!!!

atlcat 2003-12-05 01:13:53
平台:SQL Server 2000/VB 6.0/ADO 2.6
----------------------------------------------------
我在窗体frmYg中选择图片,然后调用自定义模块clsYgZl中的YGTPSAVE方法存储图片。
在自定义模块clsYgZl中的YGTPSAVE方法中调用了数据库的存储过程YGTPSAVE。实纪上
是想用存储过程最终实现图片的存储。VB代码运行一切正常,只是在调用存储过程的时
报以下错误:

实时错误'-2147217900 (80040e14)'
向UpdateText函数传递了Null textptr(text,ntext或image指针).
----------------------------------------------------------

以下是我的窗体模块frmYg
Private Sub cmdPhotoAdd_Click()
CommonDialog1.Filter = "BMP Files(*.bmp)|*.bmp|JPEG Files(*.jpg)|*.jpg|GIF Files(*.gif)|*.gif"
CommonDialog1.ShowOpen
fn = CommonDialog1.FileName
Picture1.Picture = LoadPicture(fn)
stm.LoadFromFile fn
jj.YGTPSAVE stm.Read 'jj为类模块clsYgZl的对象,以stm.Read为参数调用类模块的YGTPSAVE方法

End Sub

以下是我的类模块clsYgZl
Public Sub YGTPSAVE(ygtp) '类模块的方法YGTPSAVE,有一个变体类型的参数ygtp
cmd.CommandText = "YGTPSAVE" '指定存储过程YGTPSAVE
cmd.CommandType = adCmdStoredProc
Set cmd.ActiveConnection = cn
cmd.Parameters("@ygtp").Value = ygtp '传递参数
cmd.Execute '执行到这里就报错,以下是错误信息:
'实时错误'-2147217900 (80040e14)'
'向UpdateText函数传递了Null textptr(text,ntext或image指针).

End Sub

以下是我的存储过程

use dbEMS
go
create PROCEDURE YGTPSAVE
@ygtp image
as
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(EmpPhoto) FROM tableEmployee
UPDATETEXT tableEmployee.EmpPhoto @ptrval 0 0 @ygtp
go
...全文
32 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2003-12-05
  • 打赏
  • 举报
回复
WRITETEXT
允许对现有的 text、ntext 或 image 列进行无日志记录的交互式更新。该语句将彻底重写受其影响的列中的任何现有数据。WRITETEXT 语句不能用在视图中的 text、ntext 和 image 列上。

UPDATETEXT
更新现有 text、ntext 或 image 字段。使用 UPDATETEXT 在适当的位置更改 text、ntext 或 image 列的一部分。使用 WRITETEXT 来更新和替换整个 text、ntext 或 image 字段。

atlcat 2003-12-05
  • 打赏
  • 举报
回复
如何真接从数据库中知道该image字段有什么存储数据?

UPDATETEXT和WRITETEXT有什么区别?
pengdali 2003-12-05
  • 打赏
  • 举报
回复
给一个vb的例子给你
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim stm As ADODB.Stream

Private Sub SavePictureToDB(cn As ADODB.Connection)
'将BMP图片存入数据库
On Error GoTo EH
Set stm = New ADODB.Stream
rs.Open "select ImagePath,ImageValue from tbl_Image", cn, adOpenKeyset, adLockOptimistic
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName

With stm
.Type = adTypeBinary
.Open
.LoadFromFile CommonDialog1.FileName
End With
With rs
.AddNew
.Fields("ImagePath") = Text1.Text
.Fields("ImageValue") = stm.Read
.Update
End With
rs.Close
Set rs = Nothing
Exit Sub
EH: MsgBox Err.Description, vbInformation, "Error"
End Sub


Private Sub LoadPictureFromDB(cn As ADODB.Connection)
'载数据库中读出BMP图片
On Error GoTo EH
Dim strTemp As String
Set stm = New ADODB.Stream
strTemp = "c:\temp.tmp" '临时文件,用来保存读出的图片
rs.Open "select ImagePath,ImageValue from tbl_image", cn, , , adCmdText
With stm
.Type = adTypeBinary
.Open
.Write rs("ImageValue")
.SaveToFile strTemp, adSaveCreateOverWrite
.Close
End With
Image1.Picture = LoadPicture(strTemp)
Set stm = Nothing
rs.Close
Set rs = Nothing
Exit Sub
EH: MsgBox Err.Description, vbInformation, "Error"
End Sub
zjcxc 元老 2003-12-05
  • 打赏
  • 举报
回复
--或者将存储过程改为:

use dbEMS
go
create PROCEDURE YGTPSAVE
@ygtp image
as
DECLARE @ptrval binary(16)
if not exists(select 1 from tableEmployee)
insert into tableEmployee(EmpPhoto) values(0x) --表一定要初始化

SELECT @ptrval = TEXTPTR(EmpPhoto) FROM tableEmployee
UPDATETEXT tableEmployee.EmpPhoto @ptrval 0 0 @ygtp
go
zjcxc 元老 2003-12-05
  • 打赏
  • 举报
回复
'改用下面的方法:

'*************************************************************************
'**
'** 使用 ADODB.Stream 保存/读取文件到数据库
'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本
'**
'** ----- 数据库连接字符串模板 ---------------------------------------
'** ACCESS数据库
'** iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
'** ";Data Source=数据库名"
'**
'** SQL数据库
'** iConcStr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
'** "User ID=用户名;Password=密码;Initial Catalog=数据库名;Data Source=SQL服务器名"
'**
'*************************************************************************
'
'保存文件到数据库中
Sub s_SaveFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
Dim iConcStr As String

'数据库连接字符串
iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=F:\My Documents\客户资料1.mdb"

'读取文件到内容
Set iStm = New ADODB.Stream
With iStm
.Type = adTypeBinary '二进制模式
.Open
.LoadFromFile "c:\test.doc"
End With

'打开保存文件的表
Set iRe = New ADODB.Recordset
With iRe
.Open "表", iConc, adOpenKeyset, adLockOptimistic
.AddNew '新增一条记录
.Fields("保存文件内容的字段") = iStm.Read
.Update
End With

'完成后关闭对象
iRe.Close
iStm.Close
End Sub

'从数据库中读取数据,保存成文件
Sub s_ReadFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
Dim iConc As String

'数据库连接字符串
iConc = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=\\xz\c$\Inetpub\zj\zj\zj.mdb"

'打开表
Set iRe = New ADODB.Recordset
iRe.Open "tb_img", iConc, adOpenKeyset, adLockReadOnly
iRe.Filter = "id=64"

'保存到文件
Set iStm = New ADODB.Stream
With iStm
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
.Write iRe("img")
.SaveToFile "c:\test.doc"
End With

'关闭对象
iRe.Close
iStm.Close
End Sub
txlicenhe 2003-12-05
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2403/2403509.xml?temp=.2279474
主  题: 交流--数据库中存/取文件
作  者: zjcxc (邹建)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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