我用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.   

    VB的不会,PB的我到有个,给你参考了.存取二进制大对象(二零零四年一月二十三日整理于深圳市南山区)在数据库应用的开发过程中,经常要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样,有可能是图像、语音文件、视频文件等,在PB中可以使用OLE的方法,也可以直接用脚本处理。
    本文介绍用脚本来处理,数据库是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论坛,如有侵权,请告知):
    江南小生:深圳土著:夏芷若:贱客无名:北京马桶:
      

  2.   

    在ImageFunc模块中输入下列代码: 
    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完全解析 作者王颖 李敏业
    我也找了一个有关资料,参考一下.
      

  3.   

    您可以采用下列方式将 ntext、text 或 image 值添加到行中: 与 char、nchar 或 binary 数据类似,在 INSERT 语句中指定相对较短的数据。
    使用 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)。 
      

  4.   

    使用updatetext 或 writetext 或textcopy
    用存储过程方法:
    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
      

  5.   

    使用updatetext 或 writetext 或textcopy
    用存储过程方法:
    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
      

  6.   

    vb的没有,C#的有个,给你参考下//将图片转成二进制 private void UploadImage()
        {//保存图片到数据库
            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(); }