【发布时间】:2016-10-02 03:19:45
【问题描述】:
我编写了最简单的程序,连接到 accessessdb 并从 Memo 列执行 SQL 查询。
查询示例:
SELECT
company_name, date_of_order_start, date_of_order_finish
FROM
customers
INNER JOIN
orders ON customers.id_customer = orders.id_customer
WHERE
company_name='Ампер';
它工作正常,但是这个查询
SELECT
company_name, date_of_order_start, date_of_order_finish, amount
FROM
customers
INNER JOIN
orders ON customers.id_customer = orders.id_customer
INNER JOIN
invoice ON invoice.id_order = orders.id_order
WHERE
company_name='Ампер';
返回语法错误
表达式“customers.id_customer=orders.id_customer”中缺少运算符 INNER JOIN invoice ON invoice.id_order=orders.id_orde' 。
是的,.id_order 中的最后一个 r 没有显示。
请帮忙,我哪里出错了。
程序代码下方
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.StdCtrls, Vcl.DBCtrls,
Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls, Data.Win.ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
Panel1: TPanel;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Label1: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//проверим - есть ли текст в Memo. Если нет, выходим:
if Memo1.Text = '' then begin
ShowMessage('Вначале введите запрос!');
Memo1.SetFocus;
Exit;
end;
//текст есть. Очистим предыдущий запрос в наборе данных:
ADOQuery1.SQL.Clear;
//добавим новый запрос из Memo:
ADOQuery1.SQL.Add(Memo1.Text);
//открываем набор данных, т.е. выполняем запрос:
ADOQuery1.Open;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Clear;
end;
procedure TForm1.Memo1Change(Sender: TObject);
begin
ADOQuery1.SQL.Add(Memo1.Text);
ADOQuery1.SQL := Memo1.Lines;
end;
end.
【问题讨论】:
-
好像查询的文本被截断了。我建议调试 Delphi 应用程序并检查文本变量中存储的值
-
请显示您从备忘录控件中检索 SQL 文本并将其放入 ADOQuery.SQL 的代码。我还建议您为所有表和列设置别名,如
SELECT c.company_name, o.date_of_order_start, o.date_of_order_finish FROM customers c INNER JOIN orders o ON c.id_customer = o.id_customer,以避免与列名发生任何意外冲突(并减少输入)。 -
我在正文中添加了代码。谢谢你帮助我
-
您在 Memo1Change 中对 ADOQuery1.SQL 的分配似乎有冲突,但我认为您不需要其中任何一个。