Delphi中SQLite如何读写二进制字段(Blob类型)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi中SQLite如何读写二进制字段(Blob类型)相关的知识,希望对你有一定的参考价值。

本文简要说明SynopseSQLite3读写二进制字段,先说下SynopseSQLite3的优点,静态编译集成SQLite3引擎,不需要额外的DLL支持,支持SQLite3加密,支持JSON表,支持网络版的SQLite3.支持线程安全保护.首先建一个表,字段类型为BLOBSL.Add('CREATE TABLE IF NOT EXISTS TEST (');SL.Add('FileName TEXT PRIMARY KEY,');SL.Add('Data BLOB);');SL.Add('');写入二进制数据:var 参考技术A 一下是读写到TMemoryStream的方法:
写入:
TBlobField(Tab.FieldByName('字段')).LoadFromStream(mem_out);
取出:
TBlobField(Tab.FieldByName('字段')).SaveToStream(mem);

SQLite 自动增量 - 如何插入值?

【中文标题】SQLite 自动增量 - 如何插入值?【英文标题】:SQLite autoincrement - How to insert values? 【发布时间】:2012-01-05 06:05:59 【问题描述】:

我生成了一个 SQLite 表(在 java 中):

create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2);

之后我尝试使用 INSERT 命令添加行:

insert into participants values ("bla","blub");

我得到了错误:

java.sql.SQLException: table participants has 3 columns but 2 values were supplied

我以为行id会自动生成,但似乎我错过了什么。


我尝试了另一种解决方案:

PreparedStatement prep = conn.prepareStatement("insert into participants values (?,?,?);");
Integer n = null;
prep.setInt(1,n);
prep.setString(2, "bla");
prep.setString(3, "blub");
prep.addBatch();
prep.executeBatch();

结果我在“prep.setInt(1,n);”处收到了一个空指针异常

你看出错了吗?

【问题讨论】:

【参考方案1】:

您是否尝试过指示您传递的参数应该与表的哪些字段相关?

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

在你的情况下可能是这样的:

INSERT INTO participants(col1, col2) VALUES ("bla","blub");

【讨论】:

我认为这可行,我找到了另一种好方法并编辑了问题!谢谢! 这是正确的方法。这也不是特定于 SQLite。 如果您正在执行架构迁移并使用 select 语句进行插入,您可以执行 insert into participants(col1, col2) select col1, col2 from t1_backup;【参考方案2】:

不使用列名的最简单方法是 using null 代替 autoincreament 是这样的

insert into table values (null, col1, col2)

如果您已经将第一列设置为自动增量,它将正常工作。

【讨论】:

【参考方案3】:

找到了一个可行的解决方案here:

PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
prep.setString(2, "bla");
prep.setString(3, "blub");

【讨论】:

【参考方案4】:

错误的原因是,当不使用列说明符时,SQL 插入希望您提供与表中的列相同数量的值。

即当您编写这样的 SQL 查询时:

INSERT INTO TableName VALUES(a1,a2, ...)

.. 值的顺序必须与表定义中的顺序完全相同(并且数量也相同)。这样做的原因是为了避免歧义并减少错误的数量。

在您的情况下,您有一个不想为其指定值的自动增量列。这当然是可能的,但是按照上面的规则你需要指定列名:

INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);

【讨论】:

以上是关于Delphi中SQLite如何读写二进制字段(Blob类型)的主要内容,如果未能解决你的问题,请参考以下文章

SQLite - 如何从 XML 文件插入 JPG 图像(使用 Delphi 2009)

delphi如何写文本文件

Delphi 读写注册表

delphi xe 二进制流读写

coredata

Delphi ADO BCD 十进制字段值设置不正确