sqlite - 如何在 Lazarus 中对 TSQLite3DataSet 应用更新

标签 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 后什么也没做.更改不会保存到数据库中——既不更新也不追加。

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

最佳答案

其实答案是这样的:

该表的创建方式是用引号中的字段名拼写 "" .这掩盖了有字段 Group 的事实。 , Glob (保留字)和X-Ray (包含 minus )并且这些词在查询编辑器中没有突出显示。当TSQLiteDataSet.ApplyUpdate构建从字段定义中跳过(不添加)引号的 SQL 字符串。

我将名称替换为 Grp , GlbXRay问题就结束了。

关于sqlite - 如何在 Lazarus 中对 TSQLite3DataSet 应用更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44798184/

相关文章:

freepascal - Pascal 将 ListView 从主窗体传递到非模态窗体

pascal - Pascal-两个不同文件之间的类继承?

java - 为什么我设置 this.getReadableDatabase() 后需要关闭数据库?

freepascal - Lazarus 中组件的名称是什么,Delphi 中的名称是 "Canvas"?

delphi - Lazarus 应用程序中的启动画面问题

delphi - Delphi 和 Lazarus 的表单初始化有何区别?

delphi - 有谁有一个关于如何使用 Synapse 的 Heartbeat 功能的好例子吗?

php - 绑定(bind) PDO 查询中的可选部分

python - 使用python3中的For循环在sqlite3中创建3列x 10行表

iphone - iPhone 上的 sqlite 在插入/更新时锁定整个数据库还是仅锁定特定表?