参考https://blog.csdn.net/bq_cui/article/details/134259372
简介
在某些数据操作需求特别简单的情况下,我们希望不要安装任何数据库,甚至连一个驱动dll都不要,因为这些驱动dll可能涉及到版本甚至跨平台问题。这种简单需求,可以直接使用csv文件作为数据集来进行增查删改操作。注意,这不是用某些数据库映射csv文件作为数据库的一个表。
这种直接操作csv文件数据集好处不少,比如不用安装任何驱动,支持跨平台,可以直接使用文本编辑器修改文件,体积极小容易发布等。当然Lazarus还有其他可用的类似方式,比如直接操作电子表格文件、dbf文件等,都不需要安装驱动,都可以实现增查删改功能。
这里简单介绍把csv映射为数据集以及相关的简单操作。
————————————————————————————————————————————————————————
核心控件就是这个 CSVDataset,位于控件集的Data Access页签中。
一定要保证目录下有 aaa.csv 文件
出现这个错误不要理它,点Abort,再重新打开Lazarus,即可
procedure TForm1.FormCreate(Sender: TObject); begin CSVDataset1.FileName := Application.Location + 'aaa.csv'; //exe目录下的CSV文件 CSVDataset1.CSVOptions.FirstLineAsFieldNames := true; //第一行为列名
//重新添加字段
CSVDataset1.FieldDefs.Clear;
CSVDataset1.FieldDefs.Add('FirstName', ftString, 20);
CSVDataset1.FieldDefs.Add('LastName', ftstring, 20);
CSVDataset1.FieldDefs.Add('City', ftString, 20);
CSVDataset1.FieldDefs.Add('Address', ftString, 30);
CSVDataset1.FieldDefs.Add('Birthdate', ftDate);
CSVDataset1.Open; // 从aaa.csv文件加载数据 //手动调整各列的列宽 dbgrid1.Columns[0].Width:=150; dbgrid1.Columns[1].Width:=150; dbgrid1.Columns[2].Width:=130; dbgrid1.Columns[3].Width:=160; dbgrid1.Columns[4].Width:=120; end;
procedure TForm1.Button1Click(Sender: TObject);//删除一行 begin if not CSVDataset1.IsEmpty then begin CSVDataset1.DisableControls; CSVDataset1.Delete ; CSVDataset1.EnableControls; CSVDataset1.SaveToCSVFile(Application.Location + 'aaa.csv'); //剩下的记录返回aaa.csv end; end;
procedure TForm1.Button2Click(Sender: TObject); //末尾 添加一条 begin CSVDataset1.Open; // ... 末尾添加一条: CSVDataset1.Append; CSVDataset1.FieldByName('FirstName').AsString := '涂Walter李'; CSVDataset1.FieldByName('LastName').AsString := 'Mellon'; CSVDataset1.FieldByName('City').AsString := 'Oklahoma City才'; CSVDataset1.FieldByName('Address').AsString := '1261, Main Street'; CSVDataset1.FieldbyName('Birthdate').AsDateTime := EncodeDate(1999, 1, 1); CSVDataset1.Post; // //手动调整各列的列宽 dbgrid1.Columns[0].Width:=150; dbgrid1.Columns[1].Width:=150; dbgrid1.Columns[2].Width:=130; dbgrid1.Columns[3].Width:=160; dbgrid1.Columns[4].Width:=120; end;
procedure TForm1.Button3Click(Sender: TObject); //中间插入一条 begin CSVDataset1.Open; // ... 中间插入一条: CSVDataset1.Insert; CSVDataset1.FieldByName('FirstName').AsString := '中间插入一条'; CSVDataset1.FieldByName('LastName').AsString := 'Mellon'; CSVDataset1.FieldByName('City').AsString := 'Oklahoma City才'; CSVDataset1.FieldByName('Address').AsString := '1261, Main Street'; CSVDataset1.FieldbyName('Birthdate').AsDateTime := EncodeDate(1999, 1, 1); CSVDataset1.Post; // //手动调整各列的列宽 dbgrid1.Columns[0].Width:=150; dbgrid1.Columns[1].Width:=150; dbgrid1.Columns[2].Width:=130; dbgrid1.Columns[3].Width:=160; dbgrid1.Columns[4].Width:=120; end;
清空数据https://forum.lazarus.freepascal.org/index.php?topic=62413.0
procedure TForm1.Button4Click(Sender: TObject); //清空 数据,只留下 表结构 var i: Integer; begin if not CSVDataset1.IsEmpty then begin CSVDataset1.DisableControls; CSVDataset1.First; for i := CSVDataset1.RecNo to CSVDataset1.RecordCount do CSVDataset1.Delete; CSVDataset1.EnableControls; CSVDataset1.SaveToCSVFile('aaa.csv'); end; end;
测试学习代码下载:
链接:https://pan.baidu.com/s/1ZC13gY4OlSOGk0KPiK8Z9w
提取码:3txr