我用VB6.0编写一个小程序需对表内的image字段添加照片(*.BMP)表:zg
1、xm char(10)
2、zp image我操作数据库的方法是;
在VB的类模块中已将连接设定在表单form1中设3个控件:1、text1.text 用于输入xm
2、Picture1.Picture 用于显示照片 (通过打开对话框来选中照片显示)
3、command1 用于向表内保存数据在表单form1的“通用”过程中:
Private mybz As OpenRs在表单form1的form_load过程中:
Private Sub Form_Load()
Set mybz = New OpenRs
End Sub在命令按钮的command_click过程中:
mybz.rsDK1 "select xm,zp from zg"
With mybz.rs1
.AddNew
!xm = Text1.Text
!zp=???????(照片文件名)
.Update
End With
执行按钮就出错。不知如何保存。(zp字段不用,数据保存正常)
1、xm char(10)
2、zp image我操作数据库的方法是;
在VB的类模块中已将连接设定在表单form1中设3个控件:1、text1.text 用于输入xm
2、Picture1.Picture 用于显示照片 (通过打开对话框来选中照片显示)
3、command1 用于向表内保存数据在表单form1的“通用”过程中:
Private mybz As OpenRs在表单form1的form_load过程中:
Private Sub Form_Load()
Set mybz = New OpenRs
End Sub在命令按钮的command_click过程中:
mybz.rsDK1 "select xm,zp from zg"
With mybz.rs1
.AddNew
!xm = Text1.Text
!zp=???????(照片文件名)
.Update
End With
执行按钮就出错。不知如何保存。(zp字段不用,数据保存正常)
本文介绍用脚本来处理,数据库是ASA8的,附件里有表的设计,文中省略。
1、建立一个工作空间(workspace),取名为:blob。
2、建立一个应用(application),取名为:blob。
3、设计一个表blobtest,其字段定义如下:
Column Name Data Type Width Null Comment
No Integer No 号码
Name Varchar 10 No 姓名
Photo Long Binary Null 照片 4、建立一窗口w_input,内置如下控件:
控件名 类型 说明
sle_no SingleLineEdit 输入号码
sle_name SingleLineEdit 输入姓名
cb_select_photo Command Button 选择照片文件
sle_photo SingleLineEdit 显示照片文件名
cb_save Command Button 保存记录(本文只有插入)
cb_query Command Button 查询
cb_exit Command Button 退出
P_1 Picture 显示照片
界面如下:
5、编写脚本
1)、cb_select_photo的clicked事件:
string ls_photofile
string ls_named
integer li_value//选择照片文件
li_value = GetFileOpenName("选择图片文件", &
+ ls_photofile, ls_named, "图片文件", &
+ "BMP Files (*.BMP),*.BMP," &
+ "JPG Files (*.JPG),*.JPG")
sle_photo.text = ls_photofile
p_1.Picturename = ls_photofile 2)、cb_save的clicked事件:(本文只处理了新增记录,有兴趣的朋友可以完善他)
long ll_no
string ls_name
string ls_photofile
integer li_filenum
integer li_loops
integer li_counter
long ll_filelen
blob lb_read
blob lb_picture
If sle_no.text = '' or sle_name.text = '' or sle_photo.text = '' then return
ll_no = long(sle_no.text) //号码
ls_name = sle_name.text //姓名
ls_photofile = sle_photo.text //照片文件
//插入记录,先写no,name字段
Insert into blobtest (no,name)
values (:ll_no, :ls_name);
If sqlca.sqlcode = -1 then
Rollback;
Messagebox('插入记录出错',Sqlca.Sqlerrtext)
Return
Else
Commit;
End if
// 获 取 文 件 的 大 小
ll_filelen = FileLength(ls_photofile)//打开文件
li_filenum = FileOpen(ls_photofile,STREAMMODE!, READ!,LOCKREAD!)
/*FileRead() 函 数 不 支 持 读 取 大 于32K 的 文 本,
计 算 将 使 用 FileRead 函 数 的 次 数*/
IF ll_filelen > 32765 THEN
li_loops = ( (ll_filelen - 1) / 32765 ) + 1
ELSE
li_loops = 1
END IF
//读文件
FOR li_counter = 1 to li_loops
FileRead(li_filenum, lb_read )
lb_picture = lb_picture + lb_read
NEXT
FileClose(li_filenum)
//显示图片
p_1.SetPicture(lb_picture)
//写入数据库
UPDATEBLOB blobtest
SET photo = :lb_picture
WHERE no = :ll_no;
IF Sqlca.SQLNRows > 0 THEN
COMMIT;
Messagebox('提示信息','记录保存成功!')
Else
Rollback;
Messagebox('提示信息','记录保存成功,照片文件保存失败!' + sqlca.sqlerrtext)
END IF3)、cb_exit的clicked事件:
close(parent)4)、cb_query的clicked事件:
blob lb_picture
long ll_No
if sle_no.text = '' then return
ll_no = long(sle_no.text) //号码
SelectBlob photo
Into :lb_picture
From blobtest
where no = :ll_no;
//显示图片
p_1.SetPicture(lb_picture)6、效果图
1)、插入:如图输入内容并选择图片,然后选择保存按钮。2)、输入几个号码和名称并选择图片,然后逐一显示如下(本文照片取自MY83论坛,如有侵权,请告知):
江南小生:深圳土著:夏芷若:贱客无名:北京马桶:
Const ChunkSize As Long = 100
Const BlockSize As Long = 100
Const TempFile As String = "tempfile.tmp" Dim byteData() As Byte '定义数据块数组
Dim DiskFile As String '图像文件名
Dim NumBlocks As Long '定义数据块个数
Dim FileLength As Long '标识文件长度
Dim LeftOver As Long '定义剩余字节长度
Dim SourceFile As Long '定义自由文件号
Dim byteChunk() As Byte
Dim i As Long '定义循环变量 Public Sub ShowImage(Image1 As Image, _
Adodc1 As Adodc)
Erase byteChunk()
FieldSize = Adodc1.Recordset.Fields(2).ActualSize
If FieldSize <= 0 Then
Image1.Picture = LoadPicture("")
Exit Sub
End If
'提供一个尚未使用的文件号
SourceFile = FreeFile
'打开文件
Open TempFile For Binary Access Write As SourceFile
'计算数据块
NumBlocks = FieldSize \ BlockSize
LeftOver = FieldSize Mod BlockSize '得到剩余字节数
'分块读取图像数据,并写入到文件中
If LeftOver <> 0 Then
ReDim byteChunk(LeftOver)
byteChunk() = Adodc1.Recordset.Fields(2).GetChunk(LeftOver)
Put SourceFile, , byteChunk()
End If
For i = 1 To NumBlocks
ReDim byteChunk(BlockSize)
byteChunk() = Adodc1.Recordset.Fields(2).GetChunk(BlockSize)
Put SourceFile, , byteChunk()
Next i
Close SourceFile
'将文件装入到Image1控件中
Image1.Picture = LoadPicture(TempFile)
'删除临时文件
Kill (TempFile)
End Sub Public Sub SaveImage(ByVal ImageFile As String, _
Adodc1 As Adodc) If Adodc1.Recordset.BOF = True Or Adodc1.Recordset.EOF = True Then
Exit Sub
End If
If ImageFile = "" Then
Exit Sub
End If
'提供一个尚未使用的文件号
SourceFile = FreeFile
'打开文件
Open ImageFile For Binary Access Read As SourceFile
'得到文件长度
FileLength = LOF(SourceFile)
'判断文件是否存在
If FileLength = 0 Then
Close SourceFile
MsgBox DiskFile & "无内容或不存在!"
Else
NumBlocks = FileLength \ BlockSize '得到数据块的个数
LeftOver = FileLength Mod BlockSize '得到剩余字节数
Adodc1.Recordset.Fields(2).Value = Null
ReDim byteData(BlockSize) '重新定义数据块的大小
For i = 1 To NumBlocks
Get SourceFile, , byteData() '读到内存块中
Adodc1.Recordset.Fields(2).AppendChunk byteData() '写入FLD
Next i
ReDim byteData(LeftOver) '重新定义数据块的大小
Get SourceFile, , byteData() '读到内存块中
Adodc1.Recordset.Fields(2).AppendChunk byteData() '写入FLD
Close SourceFile '关闭源文件
Adodc1.Recordset.Update
End If
End Sub Private Sub Form_Activate()
For e = 30 To 2610 Step 15
Width = e
Next e
End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label2.FontBold = False
Label2.ForeColor = RGB(0, 0, 0) Label1.FontBold = False
Label1.ForeColor = RGB(0, 0, 0)
End Sub Private Sub Label1_Click()
Dim DiskFile As String
'如果没有选择学生,则返回
If CurStu.Student_Id <= 0 Then
MsgBox "请选择学生"
Unload Me
Exit Sub
End If
'使用CommonDialog控件读取图像文件
CommonDialog1.Filter = "BMP文件(*.bmp)|*.bmp|JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif"
CommonDialog1.ShowOpen
DiskFile = CommonDialog1.FileName
If DiskFile = "" Then
MsgBox "请选择照片文件"
Unload Me
Exit Sub
End If
'存储并显示照片
Call SaveImage(DiskFile, FrmStuMan.AdoStuDetail)
Call ShowImage(FrmStuMan.Image1, FrmStuMan.AdoStuDetail)
Unload Me
End Sub Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label1.FontBold = True
Label1.ForeColor = RGB(255, 0, 0) Label2.FontBold = False
Label2.ForeColor = RGB(0, 0, 0)
End Sub Private Sub Label2_Click()
If CurStu.Student_Id <= 0 Then
MsgBox "请选择学生"
Unload Me
Exit Sub
End If
'使用AppendChunk ""的方法删除图像
FrmStuMan.AdoStuDetail.Recordset.Fields(2).AppendChunk ""
FrmStuMan.AdoStuDetail.Recordset.Update
FrmStuMan.Image1.Picture = LoadPicture("")
Unload Me
End Sub Private Sub Label2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label2.FontBold = True
Label2.ForeColor = RGB(255, 0, 0) Label1.FontBold = False
Label1.ForeColor = RGB(0, 0, 0)
End Sub 具体窗体也控件,你自己再仔细核对,修改. 参考文献:VB + SQL Server完全解析 作者王颖 李敏业
我也找了一个有关资料,参考一下.
使用 WRITETEXT。
ADO 应用程序可以使用 AppendChunk 方法指定较长的 ntext、text 或 image 数据。
OLE DB 应用程序可以使用 ISequentialStream 接口写入新的 ntext、text 或 image 值。有关详细信息,请参阅 BLOBs and OLE Objects。
ODBC 应用程序可以使用 SQLPutData 执行时的数据格式写入新的 ntext、text 或 image 值。有关详细信息,请参阅Managing Text and Image Columns。
DB-Library 应用程序可以使用 dbwritetext 函数。有关详细信息,请参阅文本与图像函数 (Transact-SQL)。
用存储过程方法:
1、建立过程
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 2、建表和初始化数据
create table 表名 (编号 int,image列名 image)
go
insert 表名 values(1,0x) -- 必须的,且不是null
insert 表名 values(2,0x) -- 必须的,且不是null
go3、读入
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','I' --注意条件是 编号=1sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','I' --注意条件是 编号=2go4、读出成文件
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','O' --注意条件是 编号=1sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','O' --注意条件是 编号=2
go如果报textcopy不是可执行文件的话,你就到
C:\Program Files\Microsoft SQL Server\MSSQL\Binn
目录下拷备 textcopy.exe到:
C:\Program Files\Microsoft SQL Server\80\Tools\Binn
用存储过程方法:
1、建立过程
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 2、建表和初始化数据
create table 表名 (编号 int,image列名 image)
go
insert 表名 values(1,0x) -- 必须的,且不是null
insert 表名 values(2,0x) -- 必须的,且不是null
go3、读入
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','I' --注意条件是 编号=1sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','I' --注意条件是 编号=2go4、读出成文件
sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\图片.bmp','where 编号=1','O' --注意条件是 编号=1sp_textcopy '你的服务器名','sa','你的密码','库名','表名','image列名','c:\bb.doc','where 编号=2','O' --注意条件是 编号=2
go如果报textcopy不是可执行文件的话,你就到
C:\Program Files\Microsoft SQL Server\MSSQL\Binn
目录下拷备 textcopy.exe到:
C:\Program Files\Microsoft SQL Server\80\Tools\Binn
{//保存图片到数据库
Int32 intFile = this.ProImage.PostedFile.ContentLength;
try
{
Byte[] PhotoArray = new Byte[intFile]; //在些处将图片转为二进制 String physicPath = Server.MapPath("~/upload/"); //文件所在服务器的相对路径
String filePath = this.ProImage.PostedFile.FileName; //文件所在服务器的物理路径
String fileExt = filePath.Substring(filePath.LastIndexOf(".")); //文件扩展名 //String FileNme = this.ProImage.
UploadImageName = common.UpLoadAndSave(PhotoArray, fileExt, "upload/", physicPath);
UploadImageName = "upload/" + UploadImageName;
MessageBox.Show(this, "文件上传成功!");
}
catch (FileNotFoundException ex)
{
throw ex;
}
}
/// <summary>
/// 文件上传
/// </summary>
/// <param name="data">文件数据流</param>
/// <param name="fileExt">文件扩展名</param>
/// <param name="virPath">文件所在服务器的相对路径,不包括文件名</param>
/// <param name="physicPath">文件所在服务器的物理路径,不包括文件名</param>
/// <returns>文件名</returns>
public static string UpLoadAndSave(byte[] data, string fileExt, string virPath, string physicPath)
{
// 返回文件物理地址,修改虚拟地址
if (data == null || virPath == null || fileExt == null || physicPath == "")
{
throw new Exception(" 非法参数");
} return SaveToServer(data, fileExt, physicPath, data.Length);
}//将二进制图片转换成jpg格式 void savejpg(String NAME)
{
SqlConnection CON = new SqlConnection();
SqlCommand CMD = new SqlCommand("SQL"); FileStream fs;
BinaryWriter bw; int bufferSize = 1024;
byte[] outbyte = new byte[bufferSize];
long retval;
long startIndex = 0; CON.Open();
SqlDataReader myReader = CMD.ExecuteReader(CommandBehavior.SequentialAccess); while (myReader.Read())
{
fs = new FileStream(NAME, FileMode.OpenOrCreate, FileAccess.Write);
bw = new BinaryWriter(fs); startIndex = 0;
retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize); while (retval > 0)
{
bw.Write(outbyte);
bw.Flush();
startIndex += bufferSize;
retval = myReader.GetBytes(0, startIndex, outbyte, 0, bufferSize);
} bw.Write(outbyte);
bw.Flush(); bw.Close();
fs.Close();
} myReader.Close();
CON.Close(); }