使用delphi中的存储过程将数据存储在数据库中

时间:2017-04-26 11:26:40

标签: sql-server delphi stored-procedures

我编写SQL Server存储过程以在表中插入图像。  我的存储过程@fPhoto数据类型是图像。有一个错误,我命令它错误。我的代码有什么问题?

    DM.Connection.StartTransaction;
    DM.SP.StoredProcName := 'ProInsert;1';
    DM.SP.PrepareSQL(False);

    DM.SP.ParamByName('@fPName').Value := NameEdit.Text;
    DM.SP.ParamByName('@fPUnit').Value := UnitCMB.ItemIndex + 1;
    DM.SP.ParamByName('@fPType').Value := TypeCMB.ItemIndex + 1;
    DM.SP.ParamByName('@fPPrice').Value := PriceEdit.Text;

    if ProImage.Picture.Graphic = nil then
     (DM.SP.ParamByName('@fPhoto') as TBlobField) .Clear //Error
    else
     begin
      F := (DM.SP.FieldByName('@fPhoto') as TBlobField);
      S := TStream.Create;
      try
        S := DM.SP.CreateBlobStream(F, bmWrite);
        ProImage.Picture.Graphic.SaveToStream(S);
      finally
        S.Free;
      end;
     end;

[dcc32错误] AddProUnit.pas(94):E2010不兼容的类型:'TUniParam'和'TBlobField'

1 个答案:

答案 0 :(得分:1)

您应该使用ParamByName代替FieldByName

使用UniDAC,您可以使用LoadFromFileLoadFromStream获取Blob参数,如下所示:

 if ProImage.Picture.Graphic <> nil then
  begin
   MS := TMemoryStream.Create;
   try
    ProImage.Picture.Graphic.SaveToStream(MS);

    DM.SP.ParamByName('@fPhoto').LoadFromStream(MS, ftGraphic);
    // OR DM.SP.ParamByName('@fPhoto').LoadFromFile('MyFileAddress', ftGraphic);
   finally
    MS.Free
   end;
  end;