Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';无法让Delphi ADOQuery更新或插入Excel工作表_Excel_Delphi_Ado_Tadoquery_Data Controls - Fatal编程技术网

Can';无法让Delphi ADOQuery更新或插入Excel工作表

Can';无法让Delphi ADOQuery更新或插入Excel工作表,excel,delphi,ado,tadoquery,data-controls,Excel,Delphi,Ado,Tadoquery,Data Controls,我目前正在开发一个程序,该程序的功能是从Excel电子表格中读取数据,在该程序中,用户应该能够编辑库存量,并生成一份仅使用库存的单独报告,我已经完成了这项工作。我的问题发生在试图更新原始电子表格时,显示随着用户在程序上添加/删除,股票会变少/变多 我已经能够在DBGrid中显示库存的变化,但实际的电子表格上没有变化,因此每当程序重新启动时,它都会显示不变的数字。(这是通过DBEdits完成的) **我已经创建了此代码的较小版本,希望能使我的问题更清楚、更易于阅读。利用查询来尝试更新Excel电子

我目前正在开发一个程序,该程序的功能是从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.
电子表格示例:

在过去的两天里,我一直在研究这个问题,但不知怎么的,我总是找不到答案,问总是最后一搏。如果您不知道解决方案,我们将非常感谢您提供的任何指导,甚至是关于其他编程语言/IDE的建议,这将给我带来更丰硕的成果。我甚至会满足于一个Excel脚本教程,如果你能链接到我的一个可能与我目前的程序有关


很抱歉这么长的帖子,对这个网站来说是新的。非常感谢您的帮助。

我可以重现您的问题并获得帮助

UPDATE语句中出现语法错误

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

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

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

我将在下面留下我的原始答案,以防它对其他人有帮助

原始答案:

为了检查
列的字段名是否有问题,我将其添加到
TForm1中。Create

  Caption := AdoQuery1.Fields[0].FieldName;
这证实了FieldName确实是

因此,我在表单中添加了一个TDBNavigator和TDBEdit,发现我可以毫无问题地编辑TDBEdit中的

这给了我一个想法:

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
方法


如果我在让更新生效方面取得了任何进展,我会发布此答案的更新。

有趣的q,+1,因为从谷歌结果判断,其他人似乎不会在使用Sql更新工作表时遇到这个问题。我想我知道为什么-请看我更新的答案。对不起,如果在q中使用代码,“即使DBGrid显示的值已更改,并且似乎按预期工作…”不会发生。对于q中的代码,在执行
按钮1click
后,a)DBGrid为空,因为执行
ExecSQL
会关闭AdoQuery1的数据集;b)值88(如我的回答中所示)会在执行
ExecSQL
后立即存储在磁盘上的工作表中。所以,如果你得到了不同的结果,那是因为你做了一些不同于q中代码的事情。但是我看到你已经删除了我回复的评论。非常感谢你的快速回复!您的原始答案在我的示例代码中非常有效,在我的主要项目中应该可以使用。遗憾的是,您更新的答案目前不适用于我的示例代码,但我将对此进行进一步调查。我会一直打开这个帖子,直到我的主要项目开始工作,但我相信我们这里有一个赢家。我删除了之前的评论,因为我的措辞不完全是我想要通过的,空的DBGrid与我无关,据我所知,即使DBGrid是空的,我仍然可以在Excel电子表格上看到我没有看到的更改。我会在接下来的两个小时内保留这条评论,然后我会删除它以及你的评论,这些评论指的是之前删除的澄清。好的,但实际上,你只能删除你自己的评论。如前所述,我对这个网站相当陌生:D