将BLOB作为参数传递会导致错误:操作数类型冲突:图像与文本不兼容

时间:2016-11-15 12:07:25

标签: sql-server delphi delphi-7 ado

我正在研究Delphi 7+ SQL Server 2008 + ADO

我有一个包含4个字段的表

emp_id integer 
Name varchar(50) 
designation varchar(10) 
comment text

我正在尝试从Delphi插入数据

 with qryAdoEmployee do
        try
          if not prepared then Prepared := True;
          Parameters.ParamByName('emp_id').Value := 12345;
          Parameters.ParamByName('Name').Value := 'NAME';
          Parameters.ParamByName('designation').Value := 'NEWDesig' ;

所以我尝试在下面的代码行中将数据插入 ftBlob

类型的注释
          parameters.ParamByName('comment').Assign(Memo1.Lines);

上面的代码行将数据插入到数据库中,但它插入了错误的数据,如"???5?????????????????????????"

所以在谷歌花了一些时间用

代替上面的代码行
      Len := Length(Memo1.Lines.Text);
      Stream := TMemoryStream.Create;
      Stream.Write(Len, SizeOf(Len));
      Stream.Write(PChar(Memo1.Lines.Text)^, Len);
      parameters.ParamByName('comment').LoadFromStream(Stream,ftBlob);

以上代码抛出错误操作数类型冲突:图片与文字不兼容

    ExecSQL;
    except on E:EDatabaseError do 
      MessageDlg(E.Message, mtError, [mbOK], 0);
    end;

1 个答案:

答案 0 :(得分:4)

SQL Server text类型应映射到Delphi中的ftMemo(而不是ftBlob)。

如果您在设计时定义了参数,请确保DataType设置为ftMemo,或者在运行时设置:

parameters.ParamByName('comment').DataType := ftMemo;

然后只需指定参数Value

parameters.ParamByName('comment').Value := Memo1.Text;