无法将Delphi ADOQuery更新或插入到Excel工作表中

问题描述 投票:2回答:1

我目前正在开发一个程序,其功能是从Excel电子表格中读取数据,用户应该能够编辑库存量并生成仅使用库存的单独报告,这是我已经完成的。尝试更新原始电子表格时出现问题,显示当用户在程序上添加/删除时,股票变得越来越少。

我已经能够显示DBGrid中的库存变化,但是没有对实际的电子表格进行任何更改,因此每当程序重新启动时,它将显示未更改的数字。(这是通过DBEdits完成的)

**我创建了一个较小版本的代码,以使我的问题更清晰,更容易阅读。使用查询来尝试更新Excel电子表格,电子表格中的第一行的值为17,程序尝试更改为5.每当我运行此代码时,我得到“更新语句中的语法错误”,我相当确定不是这种情况。我玩过代码添加了诸如此类的东西

ADOQuery.open ADOQuery.Enabled:= false ADOQuery.Enabled:= true

每个给我不同的错误。**

代码如下:

procedure TForm1.FormCreate(Sender: TObject);
begin

  //Building Connection string as well as recieving filename of excel document
  OpenDialog1.Execute;
  ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' + OpenDialog1.FileName + ';' + 'Extended Properties="Excel 8.0;IMEX=2"';

  //Working SQL statement to display records in DBGrid
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet1$];');
  ADOQuery1.Active := true;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   //Broken code, purpose is to replace the first row value with a new value
   ADOQuery1.SQL.Clear;

   ADOQuery1.SQL.Add('UPDATE [Sheet1$]');
   ADOQuery1.SQL.Add('SET Value = 5');
   ADOQuery1.SQL.Add('WHERE Value = 17;');

   ADOQuery1.ExecSQL;


end;

end.

示例电子表格:Sample Spreadsheet used in code above

我在过去的两天里对这个问题进行了研究,但不知何故,答案似乎总是让我不断回答,总是要求最后的努力。如果你不知道解决方案,任何指导都会受到赞赏,甚至对其他编程语言/ IDE的建议也会给我带来更丰富的成果。如果你能够链接一个可能与我当前程序相关的我,我甚至会选择一个Excel脚本教程

P.S对于这么长的帖子很抱歉,对这个网站来说相当新。非常感谢所有帮助。

excel delphi ado tadoquery data-controls
1个回答
2
投票

我可以重现你的问题并获得

UPDATE语句中的语法错误。

更新的答案我尚未对此进行全面调查,但我认为您的问题是由于您选择Value作为列名而引起的。我认为这个名称可能与ADO层解释UPDATE语句的方式有冲突。我认为,因为如果我使用这个Sql语句

'更新[Sheet1 $]设置[值] = 88,其中[值] = 5'

,查询正确执行并正确更新包含5的单元格的值。

我将在下面留下我原来的答案,以防它帮助别人。

原始答案:

要检查Value列的FieldName是不是有问题,我将其添加到TForm1.Create

  Caption := AdoQuery1.Fields[0].FieldName;

并确认FieldName确实是Value

然后我在表格中添加了TDBNavigator和TDBEdit,发现我可以毫不费力地编辑TDBEdit中的Value值。

这给了我一个想法:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if AdoQuery1.Locate('Value', '5', []) then begin
    AdoQuery1.Edit;
    AdoQuery1.FieldByName('Value').AsString := '99';
    AdoQuery1.Post;
  end;
end;

这很好。显然,这并不完全是你想要的,因为如果有多行与WHERE子句匹配,它并不能完全复制UPDATE语句会做什么,但有多种方法可以实现这一点,例如:使用AdoQuery的Seek方法。

如果我在UPDATE工作方面取得任何进展,我会发布此答案的更新。

© www.soinside.com 2019 - 2024. All rights reserved.