【发布时间】:2018-01-10 21:56:44
【问题描述】:
我有以下代码;
unit UNewCar;
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.Mask,
Vcl.DBCtrls, Vcl.Grids, Vcl.DBGrids, Data.Win.ADODB, Datasnap.DBClient,
Vcl.ExtCtrls;
type
TFNewCar = class(TForm)
ADOConnection1: TADOConnection;
ADOQueryTC: TADOQuery;
DataSourceTC: TDataSource;
ADOQueryCC: TADOQuery;
DataSourceCC: TDataSource;
DBLookupComboBox1: TDBLookupComboBox;
Label1: TLabel;
Label2: TLabel;
BtnNew: TButton;
BtnSave: TButton;
DBGrid1: TDBGrid;
ADOQueryTCCusID: TAutoIncField;
ADOQueryTCName: TWideStringField;
ADOQueryTCCName: TWideStringField;
ADOQueryTCAdd: TWideMemoField;
ADOQueryTCCity: TWideStringField;
ADOQueryTCPhone: TWideStringField;
ADOQueryTCEmail: TWideStringField;
ADOQueryCCName: TWideStringField;
ADOQueryCCCusID: TIntegerField;
ADOQueryCCCar: TWideStringField;
DBEdit1: TDBEdit;
procedure BtnNewClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure ADOQueryCCBeforeEdit(DataSet: TDataSet);
procedure ADOQueryCCBeforeInsert(DataSet: TDataSet);
procedure ADOQueryCCBeforePost(DataSet: TDataSet);
private
procedure CheckSaveButtonClicked;
function GetSaveEnabled: Boolean;
procedure SetSaveEnabled(const Value: Boolean);
protected
public
SaveClicked : Boolean;
property SaveEnabled : Boolean read GetSaveEnabled write SetSaveEnabled;
end;
var
FNewCar: TFNewCar;
implementation
{$R *.dfm}
procedure TFNewCar.FormCreate(Sender: TObject);
begin
SaveEnabled := False;
ADOQueryCC.Open;
ADOQueryTC.Open;
ADOQueryCC.Requery;
end;
procedure TFNewCar.ADOQueryCCBeforeEdit(DataSet: TDataSet);
begin
SaveEnabled := True;
end;
procedure TFNewCar.ADOQueryCCBeforeInsert(DataSet: TDataSet);
begin
SaveEnabled := True;
DBEdit1.SetFocus;
end;
procedure TFNewCar.ADOQueryCCBeforePost(DataSet: TDataSet);
begin
CheckSaveButtonClicked;
end;
procedure TFNewCar.CheckSaveButtonClicked;
begin
if not SaveClicked then begin
AdoQueryCC.Cancel;
Abort; // In case the user clicked the DBNavigator Save button
end;
end;
procedure TFNewCar.btnSaveClick(Sender: TObject);
begin
SaveClicked := True;
if DBEdit1.Text = '' then
begin
ShowMessage('Please enter the missing data!');
end
else
begin
AdoQueryCC.Post;
SaveEnabled := False;
ADOQueryCC.close;
ADOQueryCC.SQL.text:='SELECT tcustomer.Name, tcustomercar.CusID, tcustomercar.Car FROM tcustomer, tcustomercar WHERE tcustomer.CusID = tcustomercar.CusID';
ADOQueryCC.Open;
end;
end;
function TFNewCar.GetSaveEnabled: Boolean;
begin
Result := btnSave.Enabled;
end;
procedure TFNewCar.SetSaveEnabled(const Value: Boolean);
begin
btnSave.Enabled := Value;
SaveClicked := False;
end;
procedure TFNewCar.BtnNewClick(Sender: TObject);
begin
ADOQueryCC.Insert;
end;
end.
遵循 AdoqueryCC =>SQL
SELECT tcustomer.Name, tcustomercar.CusID, tcustomercar.Car FROM tcustomer, tcustomercar WHERE tcustomer.CusID = tcustomercar.CusID
当我的表单 FNewCar 加载时它没有最近的更改,即使我尝试使用 Requery 并刷新来创建一个事件。 FNewCar 表单允许用户成功输入新记录(汽车),但是当尝试更新字段时也会出现以下错误“ 用于更新或刷新的键列信息不足"
我做错了什么???
【问题讨论】:
-
撇开最近的更改问题不谈,在代码的哪一行 exact 上,您会收到“Insufficient key column”错误?如果它不在你的q中,你需要添加发生错误的方法的代码。
-
您缺少主键。
-
你在问为什么你会被否决。这是因为您的 q 目前是题外话,因为您没有提供足够的信息让读者能够回答。 @Victoria 非常擅长回答问题,但即使是她也不得不猜测你在做什么。读者不必猜测。正如她所说,您应该提供 MCVE - 请参阅 stackoverflow.com/help/mcve。
-
所以,您不应该期望 SO 读者从外部来源下载材料 - 它可能被任何类型的恶意软件挖掘。您的 q 这里应该是独立的。查找并点击关于“如何提问”的 SO 链接。
-
欢迎来到 Stack Overflow。 这是到其他地方的链接。请去那里,弄清楚我的问题是什么,然后回到这里给我一个解决方案不是这个网站的工作方式。 相关代码必须在您的问题本身中。请参阅 How to Ask 和 How to Create a Minimal, Complete and Verifiable Example,然后回来并 edit 您的帖子提供最小代码,以便我们重现问题。如果你不能这样做,那么你的问题很可能不适合这个网站。