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 TABLEIF NOT EXISTS

您更改了 SQL DDL 命令来创建表,但新命令从未运行,因为该表已经存在。

您需要检查架构是否正确,导出数据,删除或重命名表,使用新的正确列列表创建表,并导入旧数据(为新列提供适当的值)。

【讨论】:

【参考方案3】:

很高兴知道您将 SQLlite 与 AM1808 处理器集成。目前我正在做同样的事情。请让我知道如何获取 SQLlite 的源代码,如何为我们的处理器和示例应用程序从 c 编译它以创建、插入表等。

【讨论】:

以上是关于SQLite 3 与 AM1808 嵌入式 Linux 接口的主要内容,如果未能解决你的问题,请参考以下文章

工具开源的嵌入式数据库引擎: SQLite 3.8.7版本发布

与nodejs一起使用的SQLite

(26)SQLite集成与用法

Sqlite嵌入式数据库讲解

SQLite3下载与安装

嵌入式工程师进阶,基于AM64x开发板的IPC多核开发案例分享