SQLite 3 与 AM1808 嵌入式 Linux 接口
Posted
技术标签:
【中文标题】SQLite 3 与 AM1808 嵌入式 Linux 接口【英文标题】:SQLite 3 interfacing with AM1808 Embedded Linux 【发布时间】:2012-10-06 07:04:13 【问题描述】:我已经将 SQLite3 与我的 Am1808 处理器连接起来。我将数据存储在 SD 卡中。
它工作得很好。我为 38 个字段插入了一个表格。现在我想在同一个表中添加一列。所以我已经更改了表字段参数,并在相关文件中进行了相应的更改。 我的代码成功编译,但是当我执行应用程序时,它给了我以下错误:
错误:“39 个值的 38 列”
这是我修改后创建的表:
const char *SQL_CREATE_ABCTABLE = "CREATE TABLE IF NOT EXISTS MilkCollection \
( MilkCollectionId INTEGER, \
CollectionDate DATE, \
CollectionShift UNSIGNED TINYINT, \
MemberId INTEGER REFERENCES Member(MemberId) ON UPDATE RESTRICT ON DELETE RESTRICT, \
SocietyId INTEGER REFERENCES Society(SocietyId) ON UPDATE RESTRICT ON DELETE RESTRICT, \
SampleNo UNSIGNED INTEGER, \
MilkType UNSIGNED TINYINT, \
Qty FLOAT, \
ActualQty FLOAT, \
QtyType UNSIGNED TINYINT, \
Fat FLOAT, \
ActualFat FLOAT, \
LRCLR FLOAT, \
ActualLRCLR FLOAT, \
SNF FLOAT, \
ActualSNF FLOAT, \
Solid FLOAT, \
ActualSolid FLOAT, \
Water FLOAT, \ // I have inserted this field
FatKG FLOAT, \
ActualFatKG FLOAT, \
SNFKG FLOAT, \
ActualSNFKG FLOAT, \
Rate FLOAT, \
Amount FLOAT, \
ActualAmount FLOAT, \
CanNumber UNSIGNED INTEGER, \
MemberCodeAuto UNSIGNED TINYINT, \
WeightAuto UNSIGNED TINYINT, \
FatAuto UNSIGNED TINYINT, \
LRCLRAuto UNSIGNED TINYINT, \
SNFAuto UNSIGNED TINYINT, \
EntryMode UNSIGNED TINYINT, \
CreatedBy INTEGER REFERENCES UserMaster(UsermasterId) ON UPDATE RESTRICT ON DELETE RESTRICT, \
CreatedOn DATE, \
UpdatedBy INTEGER REFERENCES UserMaster(UsermasterId) ON UPDATE RESTRICT ON DELETE RESTRICT, \
UpdatedOn DATE, \
FlagGSM UNSIGNED TINYINT, \
FlagUSB UNSIGNED TINYINT, \
PRIMARY KEY (MilkCollectionId) )";
创建此表后,我删除了旧的数据库文件。
我仍然收到此错误。
【问题讨论】:
x columns for y values
不是 SQLite 错误消息。请显示出现此错误的代码和查询。
【参考方案1】:
在您的 INSERT
命令中,您有 39 个列名,但只有 38 个 NULL
/?
值。
【讨论】:
const char *INSERT_MILKCOLLECTIONTABLE = "插入 MilkCollection ( MilkCollectionId, CollectionDate, CollectionShift, MemberId, SocietyId,SampleNo, MilkType, Qty, ActualQty, QtyType, Fat, ActualFat, LRCLR, ActualLRCLR, SNF, ActualSNF, Solid, ActualSolid, Water, FatKG, ActualFatKG, SNFKG, ActualSNFKG, Rate, Amount, ActualAmount, CanNumber, MemberCodeAuto, WeightAuto, FatAuto, LRCLRAuto, SNFAuto, EntryMode, CreatedBy, CreatedOn, UpdatedBy, UpdatedOn, FlagGSM, FlagUSB) 值(NULL, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,NULL,?,?,?)";这是对数据插入的查询 这属于问题。 哇,我找到了解决方案。谢谢。但我想知道为什么需要这个值?意味着为什么我们必须为每个字段分配这样的值(?, NUll )? 列出的每一列都需要一个值。但是你可以省略列,这样它们就会隐式地得到 NULL;见the documentation。【参考方案2】:CREATE TABLE
IF NOT EXISTS
您更改了 SQL DDL 命令来创建表,但新命令从未运行,因为该表已经存在。
您需要检查架构是否正确,导出数据,删除或重命名表,使用新的正确列列表创建表,并导入旧数据(为新列提供适当的值)。
【讨论】:
【参考方案3】:很高兴知道您将 SQLlite 与 AM1808 处理器集成。目前我正在做同样的事情。请让我知道如何获取 SQLlite 的源代码,如何为我们的处理器和示例应用程序从 c 编译它以创建、插入表等。
【讨论】:
以上是关于SQLite 3 与 AM1808 嵌入式 Linux 接口的主要内容,如果未能解决你的问题,请参考以下文章