> Hej Stig!
>
> Jeg vil gerne fortsætte med mine problemer med forståelsen af SQL.
>
> Jeg har en tekst i en TDBMemo, som jeg efter ændring gerne vil have indsat
i
> et Memofelt i Ejendom.db.
> Jeg forsøger med nedenstående procedure, men har ikke held med det.
>
> Jeg får i linie 14 en fejlmelding "Query1: Parameter 'Bem' not found". Det
> forstår jeg ikke for feltet "Bem" findes, det ser jeg med 5. linie.
> Egentlig skal jeg nok bruge "Update", da det er en eksisterende record,
der
> skal ændres, men da det er tilskrivningen af Value, der ikke virker, er
> problemet jo det samme!
> Da der stoppes allerede i linie 14 ved jeg endnu ikke om resten virker.
>
> .....................
> procedure TEjendomsForm.dbmEjendomsMemoExit(Sender: TObject);
> Var qInsert : TQuery;
> BemText, Ejendom : String;
> begin
> tbEjendom.GetFieldNames(Listbox1.items); //Til debug: Vis feltnavne
> BemText := dbmEjendomsMemo.Text;
> Application.ProcessMessages;
> Ejendom := EjendomsForm.tbEjendom.FieldByName('EjendomsId').Text;
> Query1.Close;
> With Query1 do
> Begin
> Close;
> Unprepare;
> ParamByName('Bem').AsString := BemText; //Fejl: Query1: Parameter
'Bem'
> not found
> Prepare;
> SQL.Clear;
> SQL.Add('Select EjendomsId From Ejendom ');
> SQL.Add(' Where EjendomsId = '+ Ejendom);
> Try //Find
> Open;
> Except //Ikke fundet EjendomsId
> MessageDlg('Kunne ikke finde "'+Ejendom+'" i Ejendom.db',
> mtInformation, [mbOK],0);
> End; //Find
> If Not Query1.Eof Then
> Begin // Fundet
> SQL.Clear;
> SQL.Add('Insert Into Ejendom(Bem) Values(:BemText)');
> Try //Indsæt
> ExecSQL;
> Except
> //Fejl
> MessageDlg('Fejl. Data ikke indskrevet', mtInformation, [mbOK],0);
> End; //Indsæt
> End; //Fundet
> Close;
> End; //With Query1
> End;
>
> --
> Med venlig hilsen
> Kurt Guldbæk
Hej Kurt
Ja undskyld jeg ikke hedder Stig, men måske kan jeg hjælpe dig lidt videre.
Du blander så vidt jeg kan se lidt rundt på dine navne. Det ser udtil at du
bruger bemtext som parameternavn men forsøger at bruge bem i parambyname,
men jeg kan jo tage fejl.
Kik lige her en gang
qyery.close;
query.clear; // medmindre at du altid bruger samme sql string, så behøver du
bare at sætte strings på query
query.sql.add('select * from DisneyTabel');
query.sql.add('where');
query.sql.add('feltA=:Kurtspar1');
query.sql.add('and feltB=:Kurtspar2');
query.parambyname('Kurtspar1').AsString := 'Anders';
query.parambyname('Kurtspar2').AsString := 'And';
query.open;
while not query.isEmpty do
begin
bla bla
query.next; // vigtig eller endless loop
end;
query.close;
En andet ting du bør lære er at bruge funktionen "format" og nej det er ikke
formatering af din harddisk
samme exempel som ovenstående kunne også se således ud.
var
sSql : string;
sTblname : string;
sFields : string;
sWhere : string;
begin
sTblname := 'DisneyTabel';
sFields := '*'; // kunne også være specifikke felter, men jeg er for doven
sWhere := format('feltA=%s and feltA:=%s',['Anders', 'And']);
SqlString := format('select %s from %s where %s',[sFields, sTblname,
sWhere]);
qyery.close;
query.clear; // medmindre at du altid bruger samme sql string, så behøver
du bare at sætte strings på query
query.sql.add(Sqlstring);
query.open;
while not query.isEmpty do
begin
bla bla
query.next; // vigtig eller endless loop
end;
query.close;
end;
Den sidste har et par klare fordele i forhold til den første.
1. Det er meget meget lettere at debugge på præcist hvordan det endelige sql
statement ser ud.
2. Du kan faktisk, som vist, også have tabelnavnet som variable, det kan man
ikke med Parambyname.
mvh
Henry