如何在Lazarus中将更新应用于TSQLite3DataSet

时间:2017-06-28 09:06:59

标签: sqlite lazarus freepascal

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

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; 

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

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后,没有做任何事情。这些更改不会保存到数据库中 - 既不会更新也不会附加。

我遇到了问题。有人知道处理它的方法吗?

1 个答案:

答案 0 :(得分:1)

实际上答案如下:

表格是在字段名称拼写为引号""时的方式创建的。这掩盖了以下事实:字段GroupGlob(保留字)和X-Ray(包含minus)这些字在查询编辑器中并不高亮。当TSQLiteDataSet.ApplyUpdate构建SQL字符串时,它会跳过(不添加)字段中的引号'定义。

我将这些名称替换为GrpGlbXRay,问题已经结束。