0

只是一些背景,抱歉啰嗦了这么多。

我正在使用 System.Data.SQLite ADO.net 适配器创建本地 sqlite 数据库,这将是访问数据库的唯一进程,因此我无需担心并发性。

我正在从各种来源构建数据库,并且不想使用数据集或数据适配器或类似的东西在内存中构建这一切。我想使用 SQL (DdCommands) 来做到这一点。我不太擅长 SQL 和 sqlite 中的完整菜鸟。我基本上使用 sqlite 作为本地数据库/保存文件结构。

数据库有很多相关的表,数据与 People 或 Regions 或 Districts 无关,但打个简单的比喻,想象一下:

具有自增 RegionID、RegionName 列和各种可选列的区域表。

具有自动递增 DistrictID、DistrictName、RegionId 和各种可选列的区域表

具有自动递增 PersonID、PersonName、DistrictID 和各种可选列的人员表

所以我得到了一些代表 RegionName、DistrictName、PersonName 和其他 Person 相关数据的数据。此时可能会或可能不会创建区域、地区和/或个人。

再一次,不是最伟大的,我的想法是这样的:

  • 检查 Region 是否存在,如果存在则获取 RegionID
  • 否则创建它并获取 RegionID
  • 检查 District 是否存在,如果存在则获取 DistrictID
  • 否则创建它从上面添加 RegionID 并获取 DistrictID
  • 检查 Person 是否存在,如果存在则获取 PersonID
  • 否则创建它从上面添加 DistrictID 并获取 PersonID
  • 用其余数据更新 Person。

在 MS SQL Server 中,我将创建一个存储过程来处理所有这些。

我能看到用 sqlite 做到这一点的唯一方法是很多命令。所以我确定我没有得到这个。我已经花了几个小时在各个网站上四处寻找,但只是不觉得我在走正确的道路。任何建议将不胜感激。

4

1 回答 1

2

last_insert_rowid()与 结合使用INSERT OR REPLACE。就像是:

INSERT OR REPLACE INTO Region (RegionName)
                       VALUES (:Region   );

INSERT OR REPLACE INTO District(DistrictName, RegionID           )
                        VALUES (:District   , last_insert_rowid());

INSERT OR REPLACE INTO Person(PersonName, DistrictID           )
                      VALUES (:Person   , last_insert_rowid());
于 2010-04-02T00:14:13.493 回答