【问题标题】:How can I do insert into Blob in SQLite using Delphi XE3如何使用 Delphi XE3 在 SQLite 中插入 Blob
【发布时间】:2013-02-05 14:21:24
【问题描述】:

我尝试使用 Delphi XE3 在 SQLite 中插入 blob 字段。

我一直在使用这样的 TDBXCommand 和 TSQLConnection。 但是没有插入 blob 字段,甚至我也无法从查询中得到任何结果

procedure TDBXCommandHelper.Init(const AQry: String);
begin
  Parameters.ClearParameters;
  Close;
  Prepare;
  Text := AQry;
end;

procedure dmDB.InsertPicture;
const
  QRY = 'INSERT INTO Memo(Picture) VALUES(?)';
var
  LTransaction: TDBXTransaction;
  LBlob: TDBXParameter;
  LStream: TFileStream;
begin
  LTransaction := FDBCon.BeginTransaction;
  LStream := TFileStream.Create('d:\sample.bmp', fmOpenRead);
  LBlob := TDBXParameter.Create;
  try
    try
      FDBXCmd := FDBCon.DBXConnection.CreateCommand;
      FDBXCmd.CommandType := TDBXCommandTypes.DbxSQL;
      FDBXCmd.Init(QRY);

      LBlob.DataType := TDBXDataTypes.BlobType;
      LBlob.SubType := TDBXSubDataTypes.BinarySubType;
      LBlob.Value.SetStream(LStream, False);
      FDBXCmd.Parameters.AddParameter(LBlob);
      FDBXCmd.ExecuteUpdate;
    except
      on E: Exception do
        FDBCon.RollbackFreeAndNil(LTransaction);
    end;
    FDBCon.CommitFreeAndNil(LTransaction);
  finally
    FreeAndNil(LStream);
    FreeAndNil(LBlob);
  end;
end;

使用 TSQLConnection 但我无法得到任何结果

procedure TInsertThread.NoteInsertExcute;
const
  QRY = 'INSERT INTO Memo(Picture) VALUES(:Picture)';
var
  LTransaction: TDBXTransaction;
  LParams: TParams;
  LStream: TMemoryStream;
begin
  LTransaction := FDBCon.BeginTransaction;
  LParams := TParams.Create(nil);
  LStream := TMemoryStream.Create;
  LStream.LoadFromFile(FValues.Values[NAME_PICTURE]);
  try
    LParams.CreateParam(ftBlob, 'Picture', ptInput);
    LParams.ParamByName('Picture').LoadFromStream(LStream, ftBlob);
    FDBCon.Execute(QRY, LParams);
    FDBCon.CommitFreeAndNil(LTransaction);
  finally
    FreeAndNil(LStream);
    FreeAndNil(LParams);
  end;
end;

【问题讨论】:

  • 您可以将 LStream(内存流) 的内容编码为 base64 字符串并将其推送到您的数据库字段中。
  • 这个“插入备忘录(图片)”是什么意思? SQLite3 没有列定义,即只有一些“亲和力”。您可以在任何列中插入任何类型的数据。尝试删除“备忘录()”。 SQLite3 处理 blob 没有问题。
  • 感谢您的回答。备注是表名,表是这样定义的.. CREATE TABLE [Memo] ( [ID] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [UserID] INTEGER NOT NULL, [Date] TEXT NULL, [Type] TEXT NOT NULL, [Value] TEXT NOT NULL, [Picture] BLOB NULL )

标签: delphi sqlite delphi-xe3


【解决方案1】:

这很简单:

var
  ms: TMemoryStream;  
  sq: TSQLQuery;  
begin  
  ms := TMemoryStream.Create;
  ms.LoadFromFile('C:\Pictures\l.jpg');
  if ms <> nil then
   begin
     sq := TSQLQuery.Create(nil);
     sq.SQLConnection := con1;
     sq.SQL.Text := 'update db1 set picture= :photo ;';
     sq.Params.ParseSQL(sq.SQL.Text, true);
     sq.Params.ParamByName('photo').LoadFromStream(ms, ftBlob);
     sq.ExecSQL();
   end;   

.
其中 con1 是 TSQLConnection。

【讨论】:

    【解决方案2】:

    您可以尝试以下方法:

    function GetFileAsBytesValue(AFileName: TFileName): TArray<Byte>;
    var
      Len: Integer;
      LStream: TMemoryStream;
    begin
      LStream := TMemoryStream.Create;
      try
        LStream.LoadFromFile(AFileName);
        Len := LStream.Size;
    
        SetLength(Result, Len);
        Move(LStream.Memory^, Result[0], Len);
      finally
        LStream.Free;
      end;
    end;
    
    procedure dmDB.InsertPicture;
    const
      QRY = 'INSERT INTO Memo(Picture) VALUES(?)';
    var
      LTransaction: TDBXTransaction;
      LDBXCmd: TSQLQuery;
      LParam: TParam;
    begin
      LTransaction := FDBCon.BeginTransaction;
      LDBXCmd := TSQLQuery.Create(FDBCon);
      try
        try
          LDBXCmd.SQLConnection := FDBCon;
          LDBXCmd.SQL.Text := QRY;
          LParam := LDBXCmd.Params.CreateParam(ftBlob, 'Picture', ptInput);
          LParam.AsBlob := GetFileAsBytesValue('d:\sample.bmp');
          LDBXCmd.ExecSQL;
        except
          on E: Exception do
            FDBCon.RollbackFreeAndNil(LTransaction);
        end;
        FDBCon.CommitFreeAndNil(LTransaction);
      finally
        LDBXCmd.Free;
      end;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多