![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Field Not Found
Krants © (2007-08-28 17:00:00)Помогите разобраться с непонятной ошибкой, имеется поключение к базе(access) через пал-ру ADO, два связанных ADOQuery через TDataSource:
DS_Look.DataSet:=QueryLook;
QueryEdit.DataSource:=DS_Look;
при первичном запуске кода:
QueryLook.Close;
QueryEdit.Close;
QueryLook.SQL.Clear;
QueryLook.SQL.Add('Select id, '+field);
QueryLook.SQL.Add('From table');
QueryLook.Open;
QueryEdit.SQL.Clear;
QueryEdit.SQL.Add('select id, MyField from table Where id>=:id');
QueryEdit.SQL.Add('AND '+field+'=:'+field);
QueryEdit.Open;
при заранее заданномfield:='field1';
выполняется все великолепно!
но при вторичном запуске и измененным значениемfield:='field2';
происходит ошибка типа: "QueryLook: field 'field1' not found"
подскажите плз в чем может заключаться ошибка и как ее можно устранить?
Reindeer Moss Eater (2007-08-29 12:22:00) [21]А вообще чувак,
не морочь людям голову!
Krants © (29.08.07 11:53) [22]
> clickmaker © (29.08.07 11:51) [21]
> QueryLook или DS_Look кем-нибудь используется? (не обязательно
> в этой форме)
нет!
единственным, пока найденным, логичным решением является:
QueryDupl.Destroy;
В твоем приведенном коде нигде нету QueryDupl
Reindeer Moss Eater (2007-08-29 12:19:00) [22]Ну если связь используется и прога ругается на field1, то зачем делать вот так:
QueryLook.SQL.Add('Select id, '+field);
тем более что QueryEdit.DataSource:=DS_Look;
Krants (2007-08-29 12:14:00) [23]
> Reindeer Moss Eater © (29.08.07 12:10) [26]
а как ты думаешь, откуда берутся параметры?
QueryEdit.SQL.Add('select id, Field3 from Table1 Where id>= :id');
QueryEdit.SQL.Add('AND '+field+'= :'+field);
и с чего ты взял что связь не используется?
Reindeer Moss Eater (2007-08-29 12:10:00) [24]зачем указаывать датасорс датасету, если не указаны ключевые поля и связь н еиспользуется?
Krants (2007-08-29 12:08:00) [25]
> Reindeer Moss Eater © (29.08.07 12:05) [24]
для зеленых человечков) ну попросил же, ознакомся с вопросом сначала!
Reindeer Moss Eater (2007-08-29 12:05:00) [26]А вот это зачем, если связь не используется?
QueryEdit.DataSource:=DS_Look;
clickmaker (2007-08-29 11:59:00) [27]ну хорошо. Находим SFieldNotFound = 'Field ''%s'' not found'; в DBConsts.pas
Ищем дальше:
например
function TDataSet.FieldByName(const FieldName: string): TField;
begin
Result := FindField(FieldName);
if Result = nil then DatabaseErrorFmt(SFieldNotFound, [FieldName], Self);
end;
еще
procedure TDBLookupControl.UpdateListFields;
var
DataSet: TDataSet;
ResultField: TField;
begin
FListActive := False;
FKeyField := nil;
FListField := nil;
FListFields.Clear;
if FListLink.Active and (FKeyFieldName <> '') then
begin
CheckNotCircular;
DataSet := FListLink.DataSet;
FKeyField := GetFieldProperty(DataSet, Self, FKeyFieldName);
try
DataSet.GetFieldList(FListFields, FListFieldName);
except
DatabaseErrorFmt(SFieldNotFound, [Self.Name, FListFieldName]);
end;
и так далее по сырцам VCL.
Если ничего из найденного в проекте точно не юзается, тогда с чистой душой списываем все на зеленых человечков и идем пить пиво...
Krants (2007-08-29 11:53:00) [28]
> clickmaker © (29.08.07 11:51) [21]
> QueryLook или DS_Look кем-нибудь используется? (не обязательно
> в этой форме)
нет!
clickmaker (2007-08-29 11:51:00) [29]QueryLook или DS_Look кем-нибудь используется? (не обязательно в этой форме)
Krants (2007-08-29 11:44:00) [30]держите код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
DS_Look: TDataSource;
ADOConnection1: TADOConnection;
QueryEdit: TADOQuery;
QueryLook: TADOQuery;
procedure doit(field:string);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.doit(field: string);
begin
DS_Look.DataSet:=QueryLook;
QueryEdit.DataSource:=DS_Look;
QueryLook.Close;
QueryEdit.Close;
QueryLook.SQL.Clear;
QueryLook.SQL.Add('Select id, '+field);
QueryLook.SQL.Add('From Table1');
QueryLook.Open;
QueryEdit.SQL.Clear;
QueryEdit.SQL.Add('select id, Field3 from Table1 Where id>=:id');
QueryEdit.SQL.Add('AND '+field+'=:'+field);
QueryEdit.Open;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
doit(edit1.Text);
end;
end.
DFM:
object Form1: TForm1
Left = 192
Top = 107
Width = 403
Height = 275
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 176
Top = 160
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Edit1: TEdit
Left = 128
Top = 136
Width = 121
Height = 21
TabOrder = 1
Text = 'field1'
end
object DS_Look: TDataSource
Left = 184
Top = 56
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=prim.' +
'mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System' +
' database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Passw' +
'ord="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1' +
';Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Trans' +
'actions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create Sy' +
'stem Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:D' +
'on''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Repl' +
'ica Repair=False;Jet OLEDB:SFP=False'
LoginPrompt = False
Mode = cmShareDenyNone
Provider = 'Microsoft.Jet.OLEDB.4.0'
Left = 120
Top = 56
end
object QueryEdit: TADOQuery
Connection = ADOConnection1
CursorType = ctStatic
Parameters = <>
Left = 240
Top = 56
end
object QueryLook: TADOQuery
Connection = ADOConnection1
Parameters = <>
Left = 280
Top = 56
end
end
база: prim.mdb|Table1|id,field1,field2,field3|
после компиляции сликните Button1, измените в эдите field1 на field2 и еще раз кликните...
> Reindeer Moss Eater
особенная просьба сперва разбираться в вопросах, а потом отвечать...
Reindeer Moss Eater (2007-08-29 11:23:00) [31]Нафик шаги. все равно не сможет.
Жми Ф9, получай текст ошибки.
Записывай на бумажку имя поля.
Открывай дфм как текст, и ищи упоминание этого поля в свойствах.
Все!
sniknik (2007-08-29 11:14:00) [32]напиши последовательно шаги, что делаешь, от пустого проекта, до того минимума в котором ошибка. и "чудо" будет перед глазами.
sniknik (2007-08-29 11:12:00) [33]если никаких операций не делалось то и связи нет. а написано что есть.
Reindeer Moss Eater (2007-08-29 11:06:00) [34]Ты нас-то не уговаривай и не убеждай, что у тебя все в порядке.
Ты себя уговаривай.
Krants (2007-08-29 11:05:00) [35]
> Reindeer Moss Eater © (29.08.07 10:58) [12]
см. [9]
> и никаких других операций ни в дезигнени в рантайме
и тут неважно будь то изначально field1, field100 или field999...
Reindeer Moss Eater (2007-08-29 11:03:00) [36]Ты сам связь создал и спрашиваешь как её обнулить?
Krants (2007-08-29 11:02:00) [37]
> sniknik © (29.08.07 10:53) [10]
в том то и дело что провисает где-то связь, а вот как обнулить?
Reindeer Moss Eater (2007-08-29 10:58:00) [38]В общем закрой все. Сосчитай до десяти.
Открой фар и ищи в папке проекта файлы *.pas *.dfm содержащие слово целиком "field1"
Тогда и отыщешь своих зеленых человечков.
Reindeer Moss Eater (2007-08-29 10:56:00) [39]и никаких других операций ни в дезигне ни в рантайме с его обьектами не осуществляется!
Я и говорю, что злые зеленые человечки атакуют твою программу.
sniknik (2007-08-29 10:53:00) [40]ну а как насчёт заранее заданных field? связь то на открытых датасетах делалась, названия полей в связь то прописались. и неважно что сам ты эту операцию не делал... ты делал то что спровоцировало это.