You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Delphi7通过Memo控件批量插入多条数据到Access数据库

实现Memo控件批量插入Access数据库记录

没问题,我来帮你搞定这个批量插入的需求!核心思路是把Memo里的每一行当成一条独立的记录,每行的四个字段用分隔符(比如逗号)分开,然后循环解析每一行,批量插入到SalesTable中。下面是具体的实现方案:

步骤说明

  1. 约定Memo输入格式:让用户在Memo中按行输入记录,每行的四个字段用分隔符(比如逗号)分隔,示例格式如下:

    苹果,5.0,8.0,3.0
    香蕉,3.5,6.0,2.5
    橙子,4.0,7.5,3.5

    注意:如果字段内容本身包含逗号,建议换用其他分隔符(比如竖线|或制表符),避免分割错误。

  2. 优化插入逻辑:使用事务来提升批量插入的效率,同时保证数据一致性;用参数化SQL替代直接赋值,既安全又高效。

完整代码实现

procedure TSalesForm.BitBtn1Click(Sender: TObject);
var
  I: Integer;
  LineParts: TStringList;
  ItemName: string;
  BuyingPrice, SellingPrice, Profit: Double;
begin
  // 创建字符串列表用于分割每行的字段
  LineParts := TStringList.Create;
  try
    // 开启数据库事务,批量操作必备:提升速度+保证数据一致性
    Adoquery1.Connection.BeginTrans;
    try
      // 遍历Memo中的每一行记录
      for I := 0 to Memo1.Lines.Count - 1 do
      begin
        // 跳过空行,避免无效处理
        if Trim(Memo1.Lines[I]) = '' then
          Continue;

        // 设置分隔符,这里用逗号,你可以根据需求修改(比如#9代表制表符)
        LineParts.Delimiter := ',';
        LineParts.DelimitedText := Memo1.Lines[I];

        // 检查当前行的字段数量是否符合要求(必须是4个)
        if LineParts.Count <> 4 then
        begin
          ShowMessage('第' + IntToStr(I+1) + '行格式错误,请检查字段数量!');
          Continue;
        end;

        // 提取字段值并转换类型
        ItemName := Trim(LineParts[0]);
        try
          // 转换价格和利润为数值类型,避免字符串存入导致的后续计算问题
          BuyingPrice := StrToFloat(Trim(LineParts[1]));
          SellingPrice := StrToFloat(Trim(LineParts[2]));
          Profit := StrToFloat(Trim(LineParts[3]));
          // 可选:如果利润是自动计算的,替换成下面的代码,不用用户输入
          // Profit := SellingPrice - BuyingPrice;
        except
          on E: EConvertError do
          begin
            ShowMessage('第' + IntToStr(I+1) + '行数值格式错误:' + E.Message);
            Continue;
          end;
        end;

        // 使用参数化SQL插入记录,安全且高效
        Adoquery1.Close;
        Adoquery1.SQL.Clear;
        Adoquery1.SQL.Add('INSERT INTO SalesTable ([Item name], [buying price], [selling price], [profit])');
        Adoquery1.SQL.Add('VALUES (:ItemName, :BuyingPrice, :SellingPrice, :Profit)');
        
        // 给参数赋值
        Adoquery1.Parameters.ParamByName('ItemName').Value := ItemName;
        Adoquery1.Parameters.ParamByName('BuyingPrice').Value := BuyingPrice;
        Adoquery1.Parameters.ParamByName('SellingPrice').Value := SellingPrice;
        Adoquery1.Parameters.ParamByName('Profit').Value := Profit;
        
        // 执行插入操作
        Adoquery1.ExecSQL;
      end;

      // 所有记录处理完成后提交事务
      Adoquery1.Connection.CommitTrans;
      ShowMessage('批量插入成功!共处理' + IntToStr(Memo1.Lines.Count) + '行记录');
    except
      // 如果中间出现错误,回滚事务,保证数据库数据不被破坏
      Adoquery1.Connection.RollbackTrans;
      ShowMessage('批量插入失败,已回滚所有操作');
      raise; // 可选:抛出异常让上层处理
    end;
  finally
    // 释放字符串列表资源
    LineParts.Free;
  end;
end;

关键细节说明

  • 事务处理:BeginTrans、CommitTrans、RollbackTrans这三个方法确保要么所有记录都插入成功,要么全部回滚,不会出现部分插入的情况,同时批量提交比单条提交快很多。
  • 参数化SQL:避免了直接拼接字符串可能导致的SQL注入风险(虽然Access的注入风险较低,但这是良好的编程习惯),而且ADO会缓存SQL执行计划,重复执行时效率更高。
  • 错误处理:对每行的格式和数值转换做了校验,即使某一行出错,也不会中断整个批量操作,同时会提示用户具体的错误行,方便排查。

内容的提问来源于stack exchange,提问作者Aleki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:30:41