var
  mystream : TMemoryStream;
  mydialog : TOpenDialog;
begin
  mystream := TMemoryStream.create;
  mydialog := TOpenDialog;
  if mydialog.Execute then  mydialog.Files.SaveToStream(mystream);
  mystream.Position := 0;  with query do 
  begin
    close;
    sql.clear;
    sql.add('insert into tmptab(tmp) values(:tmp)');
★  query.paramByName('tmp').LoadFromStream(tmpstream,ftBlob);
    execsql;
  end;
  mydialog.free;
  mystream.free;
end;
如果把上面★行改成
    TBlobField(query.paramyname('tmp')).loadfromstream(mystream);
运行时就出现错误!
为什么会这样呢?

解决方案 »

  1.   

    还有一个问题,如果我用ADO呢?
    var
      myrs : variant;
      sql : string;
      mystream : TMemoryStream;
      mydialog : TOpenDialog;
    begin
      mystream := TMemoryStream.create;
      mydialog := TOpenDialog;
      if mydialog.Execute then  mydialog.Files.SaveToStream(mystream);
      mystream.Position := 0;  myrs := CreateOleObject('AdoDb.recordSet');
      myrs.cursorlocation := 3;
      sql := 这里要实现上面的功能怎么写呢?';
      myconn.execsql;
     
      mydialog.free;
      mystream.free; 
      
    end;
      

  2.   

    sql一样按说,加载的时候注意就行了
      

  3.   

    dschebei(风之琴) 
    你说的我看不懂~
    我脑子笨~
      

  4.   

    我一直都用Ado和后一种方法,但你的写法有错
    TBlobField(query.FieldByName('tmp')).loadfromstream(mystream);
      

  5.   

    刚刚试了一下还是有错误
    用原来的是对的。对:  Query1.ParamByName('tmp').LoadFromStream(tmpstream,ftBlob);
    错:  TBlobField(query1.FieldByName('tmp')).loadfromstream(tmpstream);提示
    query1 : field 'tmp' not found还有我在二楼写的那中文的部门怎么写呢?
      

  6.   

    ★  query.paramByName('tmp').LoadFromStream(tmpstream,ftBlob);
    以tblob为主题查看一下帮助你就明白了。
    另一个问题你可以使用insert into形式,利用参数进行录入!
      

  7.   

    我迟了,wangyime(我很菜,但我很努力)说对了,应该TBlobField(query.FieldByName('tmp')).loadfromstream(mystream);但要这样用的话,SQL语句就不能原文那样做了。而应该先随便插入一条记录,再修改这条记录。建议还是用第一种方法,节省插入操作,并且不容易出错。
      

  8.   

    l_xiaofeng(流水不腐)
    你说的不明白。
    ★  query.paramByName('tmp').LoadFromStream(tmpstream,ftBlob);
    是可以通过的。
    但是如果把上面的换成
    TBlobField(query1.FieldByName('tmp')).loadfromstream(tmpstream);还有这里还不怎么回写,我脑子笨~
    sql := 这里要实现上面的功能怎么写呢?';
    帮我一下。
    都研究了一个下午了,
      

  9.   

    我个人认为处理blob字段得失后,最好还是不要使用SQL!使用对应数据库的内建功能。
      

  10.   

    你的
    sql.add('insert into tmptab(tmp) values(:tmp)');
    决定该query打开前必须赋值:tmp的参数,否则打不开
    你在query尚未打开的情况下给它的字段赋值,当然会出错的
      

  11.   

    是这样的:
    tmp是query的一个参数,它的类型是参数类型TParam;
    而TBlobField()的返回值是字段类型,query 中并无字段'tmp',所以提示
     "query1 : field 'tmp' not found"
      

  12.   

    刚刚试了一下还是有错误
    用原来的是对的。对:  Query1.ParamByName('tmp').LoadFromStream(tmpstream,ftBlob);
    错:  TBlobField(query1.FieldByName('tmp')).loadfromstream(tmpstream);提示
    query1 : field 'tmp' not found
    -------------------------------------------------数据集没有打开,怎么能找到字段 ?这样试试 :Open ;
    Edit ;
    TBlobField(query1.FieldByName('tmp')).loadfromstream(tmpstream);
    Post ; //update Field 'tmp' on  First Record 
      

  13.   

    query1.close;
    query1.SQL.Clear;
    query1.SQL.add('select * from tmptab');
    query1.open;
    query1.Edit;
    TBlobField(query1.fieldbyname('tmp')).loadfromstream(tmpstream);
    query1.Post;这样就可以通过,但是好象很烦。
    如果用SQL怎么写呢?