sql-server - 将 BLOB 作为参数传递会导致错误 : Operand type clash: image is incompatible with text

标签 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类型的comment

          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;

最佳答案

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

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

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

然后只需分配参数Value:

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

关于sql-server - 将 BLOB 作为参数传递会导致错误 : Operand type clash: image is incompatible with text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40609486/

相关文章:

delphi - 在 C++ Builder 中启用安全异常处理

delphi - 如何在Delphi 6中进行base64编码?

delphi - 如何获取定时器中的剩余时间?

delphi - 在 Indy 中的 2 个连接之间直接传输数据 (TIdContext)

sql-server - SQL Server Data Tools 和 Visual Studio 问题

sql - 如何在同一表的一列中查找重复值而在另一列中查找不同值?

delphi - Windows 7 中的“打开/保存”对话框时应用程序挂起

delphi - 创建未知数量的循环

json - 如何将授权 header 从 SQL Server 传递到 API 以获取 JSON?

sql-server - 应用商店的数据库架构指南