无法让 Delphi ADOQuery 更新或插入到 Excel 工作表
Can't get Delphi ADOQuery to update or insert into Excel Worksheet
我目前正在开发一个程序,该程序的功能是从 Excel 电子表格中读取数据,用户应该能够在其中编辑库存量并生成仅使用的库存的单独报告,这个我已经做好了。我的问题发生在尝试更新原始电子表格时显示股票获得 less/more 作为程序上的用户 adds/removes。
我已经能够在 DBGrid 中显示库存变化,但实际电子表格上没有任何变化,因此无论何时重新启动程序,它都会显示不变的数字。(这是通过 DBEdits 完成的)
**我创建了此代码的较小版本,希望能使我的问题更清楚,更容易 read.Making 使用查询来尝试更新 Excel 电子表格,第一行电子表格的值为 17,程序试图将其更改为 5.Whenever 我 运行 我得到此代码 "Syntax error in Update Statement",我相当确定情况并非如此。我玩过添加诸如
之类的代码
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
这两天我一直在研究这个问题,但不知怎么的,我似乎总是找不到答案,问总是最后的努力。如果您不知道解决方案,我们将不胜感激,甚至可以提供有关其他编程 languages/IDE 的建议,这将给我带来更多丰硕的成果。如果你能 link 给我一个可能与我当前的程序相关的 Excel 脚本教程,我什至会接受
P.S 很抱歉这么长 post,这个网站还很新。非常感谢所有帮助。
我可以重现你的问题并得到
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;
而且效果很好。显然,这不是您想要的,因为如果有多个行与 WHERE 子句匹配,它不会完全复制 UPDATE 语句将执行的操作,但是您可以通过多种方式实现这一点,例如使用 AdoQuery 的 Seek
方法。
如果我在更新工作方面取得任何进展,我将post更新此答案。
我目前正在开发一个程序,该程序的功能是从 Excel 电子表格中读取数据,用户应该能够在其中编辑库存量并生成仅使用的库存的单独报告,这个我已经做好了。我的问题发生在尝试更新原始电子表格时显示股票获得 less/more 作为程序上的用户 adds/removes。
我已经能够在 DBGrid 中显示库存变化,但实际电子表格上没有任何变化,因此无论何时重新启动程序,它都会显示不变的数字。(这是通过 DBEdits 完成的)
**我创建了此代码的较小版本,希望能使我的问题更清楚,更容易 read.Making 使用查询来尝试更新 Excel 电子表格,第一行电子表格的值为 17,程序试图将其更改为 5.Whenever 我 运行 我得到此代码 "Syntax error in Update Statement",我相当确定情况并非如此。我玩过添加诸如
之类的代码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
这两天我一直在研究这个问题,但不知怎么的,我似乎总是找不到答案,问总是最后的努力。如果您不知道解决方案,我们将不胜感激,甚至可以提供有关其他编程 languages/IDE 的建议,这将给我带来更多丰硕的成果。如果你能 link 给我一个可能与我当前的程序相关的 Excel 脚本教程,我什至会接受
P.S 很抱歉这么长 post,这个网站还很新。非常感谢所有帮助。
我可以重现你的问题并得到
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;
而且效果很好。显然,这不是您想要的,因为如果有多个行与 WHERE 子句匹配,它不会完全复制 UPDATE 语句将执行的操作,但是您可以通过多种方式实现这一点,例如使用 AdoQuery 的 Seek
方法。
如果我在更新工作方面取得任何进展,我将post更新此答案。