Avatar billede cr2000 Nybegynder
12. januar 2005 - 10:23 Der er 13 kommentarer og
1 løsning

Null længe streng i database giver problemer med ADO

Jeg eksperter.

Jeg har et lille problem.
Jeg roder lidt rundt med en Access database og til at komme i kontakt bruger jeg ado.

Jeg giver lige et uddrag :

Function TForm1.GetInfoFromID(id : integer) : TStringList;
var
  Q1: TADODataset;
  TS : TStringList;
begin
Q1 := TADODataset.Create(Self);
Q1.Connection := ADOConnection1;
Q1.CommandText := 'SELECT * FROM [Music] WHERE ID = ' + IntToStr(ID);
Q1.Open;

TS := TStringList.Create;
If not Q1.Eof then
Begin
TS.Add(Q1['Artist']);
TS.Add(Q1['Title']);
TS.Add(Q1['Title2']);
TS.Add(Q1['Genre']);
TS.Add(Q1['Rate']);
end;
GetInfoFromID := TS;
//TS.Free;
Q1.Free;
end;


------------------------------------

Problemet ligger så i at hvis et af felterne ikke indeholder noget tekst kommer den ud med en "invalid variant type conversion" fejl.

Hvad gør jeg for at komme uden om den fejl?
Avatar billede martinlind Nybegynder
12. januar 2005 - 10:47 #1
function Cnv( aStrx : String ) : Variant;
begin
  Result := aStrx;
  if Result = '' then Result := NULL;
end;
Avatar billede stone Forsker
12. januar 2005 - 10:50 #2
er dine felter sat til required?,når du loader data ind i dine felter og de er dat til required for man netop denne fejlmelding, ligeledes når man prøvar at gemme data.
Avatar billede snowball Novice
12. januar 2005 - 10:57 #3
Du kan også prøve at hente dine værdier ud på nedenstående måde i stedet for. Det løser også problemet.

TS.Add(Q1.FieldByName('Artist').AsString);
Avatar billede cr2000 Nybegynder
12. januar 2005 - 12:41 #4
Prøver lige det forskellige ting :D Tak for svarende indtil vidre
Avatar billede cr2000 Nybegynder
13. januar 2005 - 09:14 #5
Jeg har brugt snowball's løsning. Virker som klart den mest simple.

Så hvis snowball lige smider et svar
Avatar billede snowball Novice
13. januar 2005 - 09:22 #6
:)
Avatar billede cr2000 Nybegynder
13. januar 2005 - 09:27 #7
Lige et hurtigt spørgsmål.

Når nu jeg retunere en TStringList i min funktion kan jeg jo ikke ".Free" den. Giver det nogle problemer? Burde jeg måske lave min funktion på en anden måde?
Avatar billede snowball Novice
13. januar 2005 - 10:07 #8
Tja, det giver jo noget hukommelse som ikke bliver frigivet, og hvis du bruger den funktion meget og den indeholder meget data, så render det jo op i den sidste endne.

Du burde måske i stedet for nok oprette din som en global variabel eller nok endnu bedre angive den som en "var" til din GetInfoFromID procedure. Så opretter og Free'er du den jo i den procedure som kalder din GetInfoFromID funktion.
Avatar billede cr2000 Nybegynder
13. januar 2005 - 11:17 #9
Kunne jeg istedet sende en anden slags variabel tilbage?
Avatar billede snowball Novice
13. januar 2005 - 11:22 #10
Du kunne måske lave det som en record i stedet for. Prøv og læs om det i hjælpen for at se om det er noget du måske kan bruge (kender jo ikke så meget til dit program).
Avatar billede cr2000 Nybegynder
13. januar 2005 - 11:38 #11
Nu har jeg lavet så den sender en "string" tilbage istedet.

Så har jeg bare result := TS.Text;
Ts.Free

Og hvor jeg kalder funktionen har jeg så:
MinMemo.Lines.Text := GetInfoFromID(10);

Er det en god løsning?
Avatar billede cr2000 Nybegynder
13. januar 2005 - 11:39 #12
Har før lavert records og gem dem i en liste. Men da jeg begyndte at rodde med det nu her kunne jeg simpelthen ikke finde ud af det.

Jeg ville ellers have en liste med en record for hver musik nummer. Men nu er jeg jo gået på databasen istedet.
Avatar billede martinlind Nybegynder
13. januar 2005 - 11:43 #13
Hvis du vil ha' rec's i din liste laver du en pointer til din rec og sætter Objects[cnt] := TObject(PMyRec);
Avatar billede cr2000 Nybegynder
13. januar 2005 - 11:54 #14
Nogle der har mod på at lave et lille eksempel?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester