参考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