2

我目前正在开发一个程序,该程序的功能是从 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 脚本教程

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

4

1 回答 1

2

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

UPDATE 语句中的语法错误。

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

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

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

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

原答案:

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

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

这证实了 FieldName 确实是Value.

然后我在表单中添加了一个 TDBNavigator 和 TDBEdit,发现我可以毫无问题地编辑ValueTDBEdit 中的值。

这给了我一个想法:

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

这很好用。显然,这不完全是您想要的,因为它不能完全复制 UPDATE 语句在有多行匹配 WHERE 子句时会执行的操作,但是您可以通过多种方式实现这一点,例如使用 AdoQuery 的Seek方法。

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

于 2018-05-16T10:38:05.533 回答