Delphi将数据从StringGrid插入数据库表

时间:2017-01-19 09:48:50

标签: delphi delphi-xe5

Iam尝试将数据从StringGrid插入到Oracle数据库表中,我尝试如下所示。

function TfrmMapping.LoadtoTable: Boolean;
var
  I, J: Integer;
  lQuery, s: string;
  lData: TArray<string>;
begin

  for I := 0 to vTableColumns.count - 1 do
  begin
    if I <> vTableColumns.count - 1 then
    begin
      s := s + vTableColumns[I] + ',';
    end
    else
    begin
      s := s + vTableColumns[I];
    end;
  end;

  for I := 1 to StrGrdLoadCSVData.RowCount - 1 do
  begin
    vSortedGrid.Add(StrGrdLoadCSVData.Rows[I].CommaText);
  end;

  for I := 0 to vSortedGrid.count - 1 do
  begin
    lQuery := 'Insert into ' + cmbBXDBTables.Text + '(' + s + ') values(' +
      vSortedGrid[I] + ')';
    DataModSample.FDQuery1.SQL.Clear;
    DataModSample.FDQuery1.SQL.Add(lQuery);
    DataModSample.FDQuery1.ExecSQL;
  end;
  Result := True;
end;

在代码中,我将StringGrid(StrGrdLoadCSVData)的所有数据添加到StringList(vSortedGrid),现在我试图循环遍历StringList以将每行添加到数据库中,但Iam无法插入,因为我的是取这样的值

Insert into abc(sno,Name)values(1,welcome);

这是因为welcome没有引号给出错误。

这样的错误:[FireDAC][Phys][Ora]ORA-00984:column not allowed here

如何修改我的代码以成功将数据插入Db。

修改

我的表结构是:

Name            Type
 ---------  ------------
 SNO          NUMBER(38)
 NAME         VARCHAR2(15)

我在桌子上想要的结果应该是这样的:

       SNO NAME
---------- ----------
         1 Hello
         2 Welcome

表中的值来自字符串List

2 个答案:

答案 0 :(得分:2)

  

这是因为没有引号欢迎它发出错误。

所以你说的是:

  for I := 0 to vSortedGrid.count - 1 do
  begin
    lQuery := 'Insert into ' + cmbBXDBTables.Text + '(' + s + ') values('+IntToStr(i+1)+',' +
      QuotedStr(vSortedGrid[I]) + ')';
    DataModSample.FDQuery1.SQL.Clear;
    DataModSample.FDQuery1.SQL.Add(lQuery);
    DataModSample.FDQuery1.ExecSQL;
  end;
  Result := True;
end;

注意:最好使用parameters

<强>更新

使用TStringGrid从<{1}}插入的另一个选项:

TFDTable

使用procedure TForm1.Button2Click(Sender: TObject); Var I : Integer; begin for i := 1 to StringGrid1.RowCount-1 do begin try FDTable1.Append; FDTable1SNO.Value := StrToInt( StringGrid1.Cells[0,i] ); FDTable1SName.Value := StringGrid1.Cells[1,i]; FDTable1.Post; except on E: Exception do begin MessageDlg(E.Message,mtError,[mbOK],0); MessageBeep(MB_ICONERROR); end; end; end; TStringGrid插入的另一个选项(避免SQL注入):

TFDQuery

您也可以procedure TForm1.Button1Click(Sender: TObject); Var I : Integer; TableName : String; begin TableName := 'Table1'; for i := 1 to StringGrid1.RowCount-1 do begin try FDQuery1.SQL.Text := 'Insert Into '+TableName+' Values(:Val1 , :Val2)' ; FDQuery1.Params.ParamByName('Val1').Value := StrToInt( StringGrid1.Cells[0,i] ); FDQuery1.Params.ParamByName('Val2').Value := StringGrid1.Cells[1,i]; FDQuery1.ExecSQL; except on E: Exception do begin MessageDlg(E.Message,mtError,[mbOK],0); MessageBeep(MB_ICONERROR); end; end; 代表Create parameters例如:

Runtime

此外,您可以使用FDQuery1.Params.CreateParam(ftString,'ParamName',ptInput) ; 获取GetTableNames()中的所有表格。

答案 1 :(得分:2)

我修改了下面的代码

function TfrmMapping.LoadtoTable: Boolean;
var
  I, J: Integer;
  lQuery, s, lcolvalues: string;
begin

  for I := 0 to vTableColumns.count - 1 do
  begin
    if I <> vTableColumns.count - 1 then
    begin
      s := s + vTableColumns[I] + ',';
    end
    else
    begin
      s := s + vTableColumns[I];
    end;
  end;

  for I := 1 to StrGrdLoadCSVData.RowCount - 1 do
  begin
    for J := 0 to vTableColumns.count - 1 do
    begin
      if J <> vTableColumns.count - 1 then
      begin
        lcolvalues := lcolvalues +
          QuotedStr(StrGrdLoadCSVData.Cells[J, I]) + ',';
      end
      else
      begin
        lcolvalues := lcolvalues + QuotedStr(StrGrdLoadCSVData.Cells[J, I]);
      end;
    end;
    lQuery := 'Insert into ' + cmbBXDBTables.Text + '(' + s + ') values (' +
      lcolvalues + ')';
    DataModSample.FDQuery1.SQL.Clear;
    DataModSample.FDQuery1.SQL.Add(lQuery);
    DataModSample.FDQuery1.ExecSQL;

    lcolvalues := '';
  end;
  Result := True;
end;

这是从字符串网格向Table插入值,我现在没有使用参数传递。我还必须尝试以确保更高的安全性。

谢谢你@Sami,使用你的FDQuery概念购买我有这个想法...

相关问题