excel - 无法让 Delphi ADOQuery 更新或插入到 Excel 工作表中

标签 excel delphi ado tadoquery data-controls

我目前正在开发一个程序,其功能是从 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 脚本教程链接给我,我什至会选择一份 Excel 脚本教程

P.S 很抱歉这篇文章很长,对于这个网站来说还很新。非常感谢所有帮助。

最佳答案

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

Syntax error in UPDATE statement.

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

'Update [Sheet1$] Set [Value] = 88 where [Value] = 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;

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

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

关于excel - 无法让 Delphi ADOQuery 更新或插入到 Excel 工作表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50365738/

相关文章:

delphi - 为什么网络摄像头图像看上去比从其他应用程序启动时更暗?

delphi - Windows Message lparam转换

sql-server - ADO - 我可以使用多个连接语句编辑复杂查询的结果吗?

database - ClientDataSet 将数字四舍五入为 15 位

excel - 如何从 vbaProject.bin 提取的十六进制流读取 vba 代码?

excel - excel中多次出现MAX值 - 选择相邻单元格中具有最高值的MAX值

delphi - 如何正确处理字符串数组以防止内存泄漏?

ms-access - HOWTO : Open an ADODB recordset from a command object that allows updating?

excel - 尝试从推文中提取坐标[Excel 中字符串的子字符串]

excel - 合并excel数据透视报告的两列