如何将MySql数据库中的StringGrid内容保存在一列中?

How to save StringGrid content in MySql database in one column?

此代码以 '|' 作为分隔符获取每行的 StringGrid 内容。

procedure TForm1.datas();
var
  iRow: integer;
  RowData : string;
begin  
  {get stringgrid content}
  for iRow := 1 to Form7.StringGrid1.RowCount -1 do  // count rows
  begin
    RowData := Form7.StringGrid1.Cells[0, iRow] + '|' + Form7.StringGrid1.Cells[1, iRow] + '|' + Form7.StringGrid1.Cells[2, iRow] + '|' + Form7.StringGrid1.Cells[3, iRow] + '|' + Form7.StringGrid1.Cells[4, iRow] + '|' + Form7.StringGrid1.Cells[5, iRow] + '|';
     
    names := RowData; // it only get the last row in string grid :(
  end;
end;

此代码用于将数据保存到数据库:

{SAVE}
procedure TForm1.SaveBtnClick(Sender: TObject);
begin                                                
  datas; // get data
  with SQLQuery4 do
  begin
    if RecordCount = 0 then
    begin
      close;
      SQL.Text := 'Insert into my_db(names) values(:names)';
      Params.ParamByName('names').AsString := names;
    
      ExecSQL;
      SQLTransaction4.Commit;
      Close;
      ShowMessage('Records Successfully Saved!');
    end;
  end;
end;

我想将所有 StringGrid 行保存到一个数据库列中,但它只保存最后一行的数据:(

我想像这样保存在我的数据库列中:

A|B|C|D|E|  // first row
F|G|H|I|J|  // second row

在您的 datas() 方法中,每个循环迭代 仅使用当前行的数据覆盖 names 的值。这就是为什么您只保存分配给 names 的最后一行。您需要改为 append 每行到 namespreserving 其现有数据,例如:

procedure TForm1.datas();
var
  iRow: integer;
  RowData : string;
begin  
  names := ''; // <-- RESET THE STRING HERE
  {get stringgrid content}
  for iRow := 1 to Form7.StringGrid1.RowCount -1 do  // count rows
  begin
    RowData := Form7.StringGrid1.Cells[0, iRow] + '|' + Form7.StringGrid1.Cells[1, iRow] + '|' + Form7.StringGrid1.Cells[2, iRow] + '|' + Form7.StringGrid1.Cells[3, iRow] + '|' + Form7.StringGrid1.Cells[4, iRow] + '|' + Form7.StringGrid1.Cells[5, iRow] + '|' + sLineBreak;
     
    names := names + RowData; // <-- APPEND, NOT OVERWRITE!
  end;
end;

不过,我可能会 re-write 将它改成更像这样的东西来稍微清理一下:

procedure TForm1.datas();
var
  iRow, iCol: integer;
  Grid: TStringGrid;
begin  
  names := '';
  {get stringgrid content}
  Grid := Form7.StringGrid1;
  for iRow := Grid.FixedRows to Grid.RowCount-1 do  // count rows
  begin
    for iCol := Grid.FixedCols to Grid.ColCount-1 do // count colums
    begin
      names := names + Grid.Cells[iCol, iRow] + '|';
    end;
    names := names + sLineBreak;
  end;
end;