gpt4 book ai didi

Delphi 将 StringGrid 中的数据插入数据库表

转载 作者:行者123 更新时间:2023-12-03 15:28:18 32 4
gpt4 key购买 nike

我尝试将数据从 StringGrid 插入到 Oracle DB 表中,我尝试如下。

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 以将每一行添加到数据库中,但我无法插入,因为我的是取这样的值

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

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

这是这样的错误:[FireDAC][Phys][Ora]ORA-00984:此处不允许列

如何修改代码以将数据成功插入数据库。

编辑

我的表结构是:

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

我想要的表结果应该是这样的:

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

表中的值来自字符串 List

最佳答案

It is because there are no quotes to welcome it is giving an error.

所以从你所说的来看:

  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;

注意:最好使用参数

更新:

使用TFDTableTStringGrid插入的另一个选项:

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;

使用 TFDQueryTStringGrid 插入的另一个选项(避免 SQL 注入(inject)):

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;

您还可以根据需要在运行时创建参数,例如:

FDQuery1.Params.CreateParam(ftString,'ParamName',ptInput) ;

您还可以使用GetTableNames()来获取数据库中的所有表。

关于Delphi 将 StringGrid 中的数据插入数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41738557/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com