怎么让VB.NET 上传图片到SQL 数据库只保存路径,图片保存到文件

怎么让VB.NET 上传图片到SQL 数据库只保存路径,图片保存到文件,第1张

一个参考过程,你试试 这里写下一个过程为: insert into pub_infor values('1234',0x,'this is a sample') 然后读入图片: sp_textcopy @srvname = '.', @login = 'sa', @password = 'sa', @dbname = 'pubs', @tbname = 'pub_info', @colname = 'logo', @filename = 'c:\picture.bmp', @whereclause = " WHERE pub_id='1234' ", @direction = 'I' 读出为: sp_textcopy @srvname = '.', @login = 'sa', @password = 'sa', @dbname = 'pubs', @tbname = 'pub_info', @colname = 'logo', @filename = 'D:\picture.bmp', @whereclause = " WHERE pub_id='1234' ", @direction = 'O' 清空:update 表 set 列=null 最后注意事项:因为filename的字符长度只有30个:即: @filename varchar (30), 所以实际应用的时候最好改为255个,当含有比较长的路径的时候就会报错: ERROR: Augment 'xxx' unrecognize 还有参数的长度@exec_str varchar (255)也修改下比较好: 我改成了这样子: CREATE PROCEDURE sp_textcopy ( @srvname varchar (30), @login varchar (30), @password varchar (30), @dbname varchar (30), @tbname varchar (30), @colname varchar (30), @filename varchar (255), @whereclause varchar (40), @direction char(1)) AS DECLARE @exec_str varchar (400) SELECT @exec_str = 'textcopy /S ' + @srvname + ' /U ' + @login + ' /P ' + @password + ' /D ' + @dbname + ' /T ' + @tbname + ' /C ' + @colname + ' /W "' + @whereclause + '" /F ' + @filename + ' /' + @direction EXEC master..xp_cmdshell @exec_str 就只这样子了,感觉上T_SQL编程还是挺强大的,有时间应该好好学习下。 回答: 这里以SQL_server2000中的pubs数据库中的pub_info表为例来说说其中的过程:pub_info表包含:pub_id,logo,pr_info,其中logo属于image超长字段,应用存储过程奖图像存储在数据库的步骤包括: 1:首先:是插入一个列: 比如:insert into pub_infor values('1234',0x,'this is a sample')其中0x只是为了确保image字段不能为空:因为下面的存储过程:textcopy 用textcopy把图片或者文件拷贝到image类型字段之前,image类型的字段不能为空。先插入0x(或者0x0)到这个字段,然后就可以用textcopy了。 否则就会报这样的错误: ERROR: Text or image pointer and timestamp retrieval failed. 2:接下来建立存储过程: CREATE PROCEDURE sp_textcopy ( @srvname varchar (30), @login varchar (30), @password varchar (30), @dbname varchar (30), @tbname varchar (30), @colname varchar (30), @filename varchar (30), @whereclause varchar (40), @direction char(1)) AS DECLARE @exec_str varchar (255) SELECT @exec_str = 'textcopy /S ' + @srvname + ' /U ' + @login + ' /P ' + @password + ' /D ' + @dbname + ' /T ' + @tbname + ' /C ' + @colname + ' /W "' + @whereclause + '" /F ' + @filename + ' /' + @direction EXEC master..xp_cmdshell @exec_str 说明: 其中xp_cmdshell: 以 *** 作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。我自己的理解是: textcopy就像是一个dos命令:就是说实际的文件copy命令是类似 *** 作系统执行的。

采纳哦

Dim i As Integer

Dim str As String

Dim conn As ADODB.Connection

Dim iStm As ADODB.Stream

Dim iRe As ADODB.Recordset

Dim n As Integer

Private Sub Form_Load()

'‘----------------------------

Picture1.Picture = LoadPicture(App.Path + "\界面素材\加载图片.jpg")

str = "Provider=SQLOLEDBdata Source= 192.168.12.67 Initial Catalog=服装销售系统User Id= sa Password= 5332852 "

Set conn = New ADODB.Connection

conn.Open str

n = Val(Trim(Text1.Text))

End Sub

Sub SaveFile() '定义读入图片程序

On Error Resume Next '重复保存同一幅图片会出错提示,忽略,保持程序运行的流畅性。

Set iStm = New ADODB.Stream'读取文件到内容

Dim sFile As String

'数据库支持PNG图片,但VB的image、picture控件不支持PNG格式的图片。

CommonDialog1.Filter = "JPG|*.jpg|位图|*.bmp|GIF|*.gif"

CommonDialog1.ShowOpen

If CommonDialog1.FileName = "" Then

Exit Sub

End If

sFile = CommonDialog1.FileName

Picture1.Picture = LoadPicture(sFile) '把图片显示到图片框(Pictrure1)

With iStm

.Type = adTypeBinary '数据类型为二进制数

.Open

.LoadFromFile "" &sFile &"" '保存图片

End With

End Sub

Sub ReadFile() '定义读出图片程序

If Trim(Text1.Text) = "" Then

MsgBox "图片编号为空", vbInformation, "提示"

Exit Sub

End If

Set iRe = New ADODB.Recordset

iRe.Open "select * from img where 编号=" &n, conn, adOpenKeyset, adLockReadOnly '注意此处数值型参数n的语法形式

On Error GoTo Err

Set iStm = New ADODB.Stream

With iStm

.Mode = adModeReadWrite

.Type = adTypeBinary

.Open

.Write iRe("photo") '读取图片字段数据

.SaveToFile App.Path &"\temp1.jpg" '保存图片。注意,图片也可以保存为其他格式。

End With

Picture1.Picture = LoadPicture(App.Path &"\temp1.jpg") '读取图片到图片框(Pictrure1)

iRe.Close'关闭对象

iStm.Close

Kill App.Path &"\temp1.jpg" '删除临时文件

Exit Sub

Err:

MsgBox "此图片编号不存在", vbInformation, "提示"

End Sub

Private Sub Command1_Click() '读入图片

Call ReadFile

End Sub

Private Sub Command2_Click() '读出图片

Call SaveFile

End Sub

Private Sub Command3_Click() '图片另存

If Trim(Text1.Text) = "" Then

MsgBox "图片编号为空", vbInformation, "提示"

Exit Sub

End If

If Picture1.Picture = 0 Then

MsgBox "图片为空,请读出图片", vbInformation, "提示"

Exit Sub

End If

Set iRe = New ADODB.Recordset

iRe.Open "select * from img where 编号=" &n, conn, adOpenKeyset, adLockReadOnly

Set iStm = New ADODB.Stream

If iRe("photo").ActualSize = 0 Then '注意判断语句

MsgBox "相片为空,请重新选择!", vbInformation, "提示"

Exit Sub '退出

End If

CommonDialog1.Filter = "JPG|*.jpg|GIF|*.gif|位图|*.bmp"

CommonDialog1.ShowSave

If CommonDialog1.FileName = "" Then

Exit Sub

End If

sFile = CommonDialog1.FileName

On Error GoTo Err '利用出错提示进行删除保存 *** 作(类似于覆盖)

With iStm

.Mode = adModeReadWrite

.Type = adTypeBinary

.Open

.Write iRe("photo")'读取图片字段数据

.SaveToFile sFile '保存到路径

Exit Sub

End With

Err:

Dim Result As Integer

Result = MsgBox("文件名重复,请重新输入新的文件名。否则,将覆盖源文件!", vbYesNo + vbInformation, "提示")

If Result = vbYes Then

Kill sFile '先删除,后保存。

iStm.Write iRe("photo")

iStm.SaveToFile sFile

End If

End Sub

Private Sub Command5_Click()

Set iRe = New ADODB.Recordset '打开保存文件的表

Dim P As String

P = MsgBox("添加成功!是否保存?", vbQuestion + vbOKCancel, "系统消息")

If P = vbOK Then

With iRe

.Open "Select * from A人员信息 WHERE 工号='" + Text2 + "'", conn, adOpenKeyset, adLockOptimistic

.Fields("图片") = iStm.Read 'iStm把载入的图片传递给iRe.Fields("photo"):img表的photo字段

.Update

End With

Else

Picture1.Picture = LoadPicture(App.Path + "\界面素材\加载图片.jpg")

End If

End Sub

Private Sub Form_Unload(Cancel As Integer) '退出

conn.Close

Set conn = Nothing

End Sub

你的sql不对,而且判断也有问题(表示条件应该是and而不是连接符&),按条件查询就要写成

sSQL = "SELECT * FROM font where ziti=""" &str &""" and bihua=""" &strokeStep &""""

后面那个If (str = rs.Fields("ziti") &strokeStep = rs.Fields("bihua")) Then可以去掉了,改成

if not rs.eof then

大概就是这样,没怎么用过VB ,实际上select *也是没必要的,应该是select top 1 *,或者如果你仅仅只是需要path,也可以写成select top 1 path from ...

至于根本的错误原因是你之前的sql返回的一个多项的记录集rs(比如数据库中一共10条记录),而你直接判断If (str = rs.Fields("ziti"),相当于只是把str跟这个记录集的第一条判断(大概是的,记不太清),也就是说,除非你那个sql找出的结果中刚好第一条满足这两个条件,那样才能显示,否则就算这十条中有一条满足,你的if结果也是假的。至于怎么改动上面已经说过了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6809490.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存