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类型)的主要内容,如果未能解决你的问题,请参考以下文章