下面是一个拷贝图像到SQL Server的pubs数据库的例子, 表名pub_info, 字段名logo,图像文件名picture.bmp,保存到pub_id='0736'记录 
sp_textcopy @srvn
ame = 'ServerName', 
            @login = 'Login', 
            @password = 'Password', 
            @dbname = 'pubs', 
            @tbname = 'pub_info', 
            @colname = 'logo', 
            @filename = 'c:\picture.bmp', 
            @whereclause = " WHERE pub_id='0736' ", 
            @direction = 'I'

解决方案 »

  1.   

    image数据类型与图纸文件的存取用户资料数据库的一个重要功能就是存储各种图纸,如装表施工图、改径施工图等。我们分析比较了几种方案。一种方案是把图纸文件以*.jpg的格式存放在硬盘的某个目录中,而在数据库的表中只存放这些图纸的文件路径。这种方法虽然便于实施,但是缺点也很明显:一是可靠性差,一旦存放图纸文件的硬件设备出现故障,或者由于某种考虑而需要变更存放的目录,那么数据库表中存储的路径将不再有效,即使要修改也非常麻烦;二是安全性低,除了管理员之外,其他人员只要能进入计算机,就能对图纸文件进行操作。三是造成了存储空间的浪费,因为文件在外存上是以簇为单位存放的,对于仅有几十个字节的文件零头,也需要占用一簇(512字节或更多)。
    然而,如果使用SQL Server 2000提供的image数据类型来存放图纸文件,就可以解决上述问题。 
    image 列所做的全部工作就是提供一个位置,用来存储组成图像数据值的位流。SQL Server 2000提供了一个小工具:Textcopy.exe,是专门用来存取image类型、ntext(长文本)类型数据的,使用很方便。我们要做的就是写一个存储过程,在应用程序中调用该存储过程,把各个必需的参数提供给Textcopy.exe,然后由它来完成存取图纸文件的工作。
    但是在具体实施的时候也遇到了一个问题。开始,我们发现Textcopy.exe只对那些现有记录的image列起作用,当试图向一条新记录中添加图纸数据时就会出错。经过反复的试验和探讨,我们找到了问题症结所在:Textcopy.exe是通过image列的文本指针来存取数据的。当image列为空时,其文本指针并不存在。要存取image列,首先必须获得文本指针;而要获得文本指针,就得先对image列作初始化。进一步的试验证明,仅仅把image列初始化为null是不够的,只有输入非空的数据才能产生一个文本指针。例如,假设表prjsketch中有两个字段:usrid 和sketch,我们要把usrid为1001的用户的一张图纸存入prjsketch表中,则在使用Textcopy.exe之前,应执行如下操作:
    INSERT INTO emp (usrid,sketch)  VALUES (‘1001’,'0xffff ')
        这就把sketch字段初始化为’0xffff’。虽然’0xffff’没有什么实际意义,但是可以确保产生并且获得文本指针。然后再使用Textcopy.exe添加图纸文件,就成功了。
    实际上,我们采用了另外一种办法来实现初始化,那就是在创建表的时候,给image列设置默认值:
     CREATE TABLE prjsketch(usrid char(4),sketch image DEFALUT ‘0xffff’)
       这样,每次添加一条新记录时,只需要执行
    INSERT INTO emp (usrid)  VALUES (‘1001’)
      则SQL Server 2000自动将prjsketch列的值置为 ’0xffff’,同样达到了初始化的目的,而且这种方式还减少了代码量,提高了程序运行效率。
      

  2.   

    textcpy。exe是什么东东啊?在哪能找到哦?怎么使啊?拜托各位大哥了。在线等
      

  3.   

    图片用字段image下列是delphi的例子
    数据库SQL Server,存放文件的字段类型Image
    Create Table MyTable
    (
    FileName VarChar(20),
    FileSource Image
    )
    存放文件到数据库var FileName :String;
    FileName := ExtractFileName(OpenDialog1.FileName);
    with Query do
    begin  Close;
      Sql.Clear;
      Sql.Add('INSERT INTO MyTable VALUES (:FileName,:FileSource)');
      ParamByName('FileName').AsString := FileName;
      ParamByName('FileSource').LoadFromFile(OpenDialog1.FileName,ftBolob);
      ExecSQL;
    end;从数据库中取出文件var
     FileName :String;
    begin
      with Query do
      begin
        Close;
        Sql.Clear;
        Sql.Add('SELECT * FROM MyTable WHERE FileName = '?'');
        Open;
        FileName := 'c:\'+FieldByName('FileName').AsString;
        (FieldByName('FileSource') AS TBlobField).SaveToFile(FileName);
      end;
    end;
      

  4.   

    我已经用VB将这个问题封装成一个类模块了,不知你想不想要?
    [email protected]