如何在 Lazarus 中应用更新到 TSQLite3DataSet

How to Apply Updates to TSQLite3DataSet in Lazarus

我正在尝试为 Lazarus 程序实现 TSQLite3DataSet 功能。在这里给出 MCVE 是 test.db 数据库的 SQLite table:

CREATE TABLE "ttest" (
  "ID"  INTEGER PRIMARY KEY AUTOINCREMENT,
  "Data"  INTEGER)

为了实现 TSQLite3Dataset 实例,我这样做了:

  object Sqlite3Dataset1: TSqlite3Dataset
    FileName = 'C:\Users\User\Desktop\SQLIte\test.db'
    PrimaryKey = 'ID'
    TableName = 'ttest'
  end 

保存更新和附加的数据工作正常。例如使用此代码:

procedure TForm1.Button3Click(Sender: TObject);
begin
  if Sqlite3Dataset1.State in [dsEdit, dsInsert] then
    Sqlite3Dataset1.Post;
  Sqlite3Dataset1.ApplyUpdates;
  Sqlite3Dataset1.RefetchData;
end; 

但是如果我将真正的空 table 分配给 class 实例:

CREATE TABLE "base" (
"ID"  INTEGER PRIMARY KEY AUTOINCREMENT,
"Code"  varchar NOT NULL,
"GCode"  varchar DEFAULT NULL,
"Fam"  varchar DEFAULT NULL,
"Name"  varchar DEFAULT NULL,
"Patr"  varchar DEFAULT NULL,
"Age"  smallint DEFAULT NULL,
"Gender"  smallint DEFAULT NULL,
"Invalid"  smallint DEFAULT NULL,
"AdmDate"  date DEFAULT NULL,
"Departament"  smallint DEFAULT NULL,
"DsAdm"  varchar DEFAULT NULL,
"DsClin"  varchar DEFAULT NULL,
"Surgery"  varchar DEFAULT NULL,
"ConditAdmission"  smallint DEFAULT NULL,
"DiagnRemarks"  varchar DEFAULT NULL,
"DiagnDuration"  float DEFAULT NULL,
"TrMethod"  smallint DEFAULT NULL,
"TreatDetails"  varchar DEFAULT NULL,
"DiseaseDuration"  float DEFAULT NULL,
"Acute"  smallint DEFAULT NULL,
"Course"  varchar DEFAULT NULL,
"Outcomes"  smallint DEFAULT NULL,
"GBA"  smallint DEFAULT NULL,
"GUA"  smallint DEFAULT NULL,
"Coag"  smallint DEFAULT NULL,
"PTI"  smallint DEFAULT NULL,
"Group"  smallint DEFAULT NULL,
"Stool"  smallint DEFAULT NULL,
"BCA"  smallint DEFAULT NULL,
"GP"  smallint DEFAULT NULL,
"Alb"  smallint DEFAULT NULL,
"Glob"  smallint DEFAULT NULL,
"Bil"  smallint DEFAULT NULL,
"BilCon"  smallint DEFAULT NULL,
"NonConBil"  smallint DEFAULT NULL,
"Chol"  smallint DEFAULT NULL,
"AST"  smallint DEFAULT NULL,
"ALT"  smallint DEFAULT NULL,
"AmilBl"  smallint DEFAULT NULL,
"AmilUr"  smallint DEFAULT NULL,
"DUr"  smallint DEFAULT NULL,
"Carbamide"  smallint DEFAULT NULL,
"Crea"  smallint DEFAULT NULL,
"Tim"  smallint DEFAULT NULL,
"Glu"  smallint DEFAULT NULL,
"RW"  smallint DEFAULT NULL,
"HBS"  smallint DEFAULT NULL,
"X-Ray"  smallint DEFAULT NULL,
"FGDS"  smallint DEFAULT NULL,
"ECG"  smallint DEFAULT NULL,
"Use"  smallint DEFAULT NULL,
"PeptUlcerGastr"  smallint DEFAULT NULL,
"PeptUlcerDuod"  smallint DEFAULT NULL,
"AcUlcer"  smallint DEFAULT NULL,
"Loc1"  varchar DEFAULT NULL,
"Loc2"  varchar DEFAULT NULL,
"Compl1"  varchar DEFAULT NULL,
"Compl2"  varchar DEFAULT NULL,
"Operation1"  varchar DEFAULT NULL,
"Operation2"  varchar DEFAULT NULL,
"ManipName"  varchar DEFAULT NULL,
"Manipulation"  varchar DEFAULT NULL,
"Coexist1"  varchar DEFAULT NULL,
"Coexist2"  varchar DEFAULT NULL,
"Coexist3"  varchar DEFAULT NULL,
"Coname"  varchar DEFAULT NULL,
"Coexisting"  varchar DEFAULT NULL,
"Cholecyst"  smallint DEFAULT NULL,
"Pancreatitis"  smallint DEFAULT NULL,
"GIB"  smallint DEFAULT NULL,
"Bulbitis"  smallint DEFAULT NULL,
"Hepatitis"  smallint DEFAULT NULL,
"Scar"  smallint DEFAULT NULL,
"Gastritis"  smallint DEFAULT NULL,
"Additional"  smallint DEFAULT NULL,
"NameofAddit"  varchar DEFAULT NULL,
"OtherName"  smallint DEFAULT NULL,
"Other"  varchar DEFAULT NULL,
"SocState"  smallint DEFAULT NULL,
"Occupation"  varchar DEFAULT NULL,
"Hazards"  smallint DEFAULT NULL,
"HazardsOther"  varchar DEFAULT NULL,
"SatisfGen"  smallint DEFAULT NULL,
"SatisfMoral"  smallint DEFAULT NULL,
"SatisfMater"  smallint DEFAULT NULL,
"UseNutrit"  float DEFAULT NULL,
"UseClothes"  float DEFAULT NULL,
"UseCulture"  float DEFAULT NULL,
"UseTreat"  float DEFAULT NULL,
"UseSport"  float DEFAULT NULL,
"FamCond"  smallint DEFAULT NULL,
"FamRelat"  smallint DEFAULT NULL,
"FamScand"  smallint DEFAULT NULL,
"FamScandReas"  smallint DEFAULT NULL,
"Stress"  smallint DEFAULT NULL,
"RelativesCount"  smallint DEFAULT NULL,
"RelativesPersons"  varchar DEFAULT NULL,
"Drugs"  smallint DEFAULT NULL,
"DrugsDetails"  varchar DEFAULT NULL,
"DietSubj"  smallint DEFAULT NULL,
"DietPlace"  smallint DEFAULT NULL,
"DietPlaceOther"  varchar DEFAULT NULL,
"DietDry"  smallint DEFAULT NULL,
"DietRegular"  smallint DEFAULT NULL,
"DietFreq"  float DEFAULT NULL,
"DietChew"  smallint DEFAULT NULL,
"DietObj"  smallint DEFAULT NULL,
"AlcoholFam"  smallint DEFAULT NULL,
"AlcoholSelf"  smallint DEFAULT NULL,
"AlcoholObj"  smallint DEFAULT NULL,
"AlcoholBeginAge"  float DEFAULT NULL,
"AlcoholBeforeYears"  float DEFAULT NULL,
"SmokeBeginAge"  smallint DEFAULT NULL,
"SmokeTotalYears"  smallint DEFAULT NULL,
"Smokes"  smallint DEFAULT NULL,
"SmokesCigarettes"  smallint DEFAULT NULL,
"ProphylPurp"  smallint DEFAULT NULL,
"Recommend"  smallint DEFAULT NULL,
"AcuteFreq"  smallint DEFAULT NULL,
"ReasontoCome"  varchar DEFAULT NULL,
"AddonA1"  varchar DEFAULT NULL,
"AddonS1"  smallint DEFAULT NULL,
"ExaminationOtherCount"  smallint DEFAULT NULL,
"ExaminationOtherName"  varchar DEFAULT NULL,
"Complications"  varchar DEFAULT NULL,
"AddonA2"  varchar DEFAULT NULL,
"AddonA3"  varchar DEFAULT NULL,
"Surgery1"  varchar DEFAULT NULL,
"Surgery2"  varchar DEFAULT NULL,
"Fio"  varchar DEFAULT NULL,
"Perf"  smallint DEFAULT NULL,
"Penetr"  smallint DEFAULT NULL,
"Malign"  smallint DEFAULT NULL,
"SmokesSigarettesNumber"  float DEFAULT NULL,
"Stenosis"  tinyint DEFAULT NULL,
"FamScandReas0"  tinyint DEFAULT NULL,
"FamScandReas1"  tinyint DEFAULT NULL,
"FamScandReas2"  tinyint DEFAULT NULL,
"FamScandReas3"  tinyint DEFAULT NULL,
"FamScandReas4"  tinyint DEFAULT NULL,
"FamScandReas5"  tinyint DEFAULT NULL,
"FamScandReas6"  tinyint DEFAULT NULL,
"Drugs0"  tinyint DEFAULT NULL,
"Drugs1"  tinyint DEFAULT NULL,
"Drugs2"  tinyint DEFAULT NULL,
"Drugs3"  tinyint DEFAULT NULL,
"Drugs4"  tinyint DEFAULT NULL,
"PeptUlcerUnknown"  smallint DEFAULT NULL)

调用 ApplyUpdates 后没有任何反应。更改不会保存到数据库中——既不会更新也不会追加。

我被这个问题困住了。有人知道处理它的方法吗?

原来答案是这样的:

table是按照字段名用引号""拼写的方式创建的。这掩盖了存在字段 GroupGlob(保留字)和 X-Ray(包含 minus)并且这些字在查询编辑器中未突出显示的事实。当 TSQLiteDataSet.ApplyUpdate 构建 SQL 字符串时,它会跳过(不添加)字段定义中的引号。

我用 GrpGlbXRay 替换了名称,问题就结束了。