【发布时间】: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