Gå til innhold

Exception ved bruk av TADOTable.


Anbefalte innlegg

Prøver å connecte til en MS SQL database, men får exception når jeg prøver å kalle "Open" på TADOTable. Exception sier noe slikt:

"Project SQLTest.exe raised exception class EVariantTypeCastError with message 'Could not convert variant of type (null) into type (string)"

 

Har egentlig laget en klasse som skal returnere TADOTable objekter til bruk mot databasen. Har bare fjernet all urelevant kode i koden under. Hvis jeg bruker designeren til å legge på et TADOConnection objekt + et TADOTAble objekt på en form, og så setter opp connection, og linker TADOTable til connection, så får jeg akkurat samme feilmelding, som når jeg bruker min kode under.

Hvis jeg derimot i designeren (under structure | classes), høyreklikker på TADOTable, og velger "Get all fields", så kan jeg kjøre programmet uten exception. Jeg har derfor en anelse om at problemet er at TADOTable ikke får lest inn feltene. Dvs at felt listen er tom.

 

Noen ideer om hva jeg bør prøve. Har googlet ganske mye nå, og koden jeg finner for å connecte via dbGo (TADOConnection + TADOTable) ser som regel ganske lik ut til det jeg bruker. Forskjellen er kansje at mange bruker et dataset for å koplet til f.eks. en tabell. Jeg kommer ikke til å trenge å kople gui elementer til min databasehåndtering.

 

Her er min forenklede kode.

//Oppretter et connection objekt, og setter noen properties (de fleste er default).

lConnection := TADOConnection.Create(self);

lConnection.Connected := false;

lConnection.LoginPrompt := false;

lConnection.ConnectOptions := coConnectUnspecified;

lConnection.IsolationLevel := ilCursorStability;

lConnection.Mode :=cmReadWrite;

lConnection.KeepConnection := True;

lConnection.CursorLocation := clUseClient;

lConnection.ConnectionString := FsConnectionString;

 

//Åpner connection til databasen.

lConnection.Open('','');

 

//Oppretter en TADOTable.

lTR := TADOTable.Create(self);

 

//Setter properties for tabellen.

lTR.Close;

lTR.Name := sTableName;

lTR.Connection := lConnection;

lTR.TableName := sTableName;

lTR.TableDirect := true;

lTR.lTable.Open; //Her får jeg Exception.

Lenke til kommentar
Videoannonse
Annonse

Gjelder dette samme hvilken tabell du forsøker å koble deg til?

Gjelder dette uansett om det er data i tabellen eller ikke?

 

Når du i designeren velger 'Get all fields' så opprettes det objekter for hver kolonne, og disse objektene er 'typete' - dvs at dersom kolonnen er spesifisert til å være en streng, så får du et stringfield-objekt, og er den spesifisert til en integer, så får du et integerfield-objekt. Dersom du ikke legger til feltene på designtime, så vil du bare få såkalt 'runtime-fields', og disse er mer generelle enn de man får opprettet på designtime. Det kan være at det ligger noe der.

 

Forsøk å legg feltene til på designtime, og fjern en og en kolonne helt til du vet hvilken kolonne som lager trøbbel.

Se om du finner en eller annen property der som sier noe om null-values.

 

-Vegar

Lenke til kommentar

Takker for svar. Har programmert litt i Delphi tidligere, men det er lenge siden. Det viste seg at exception bare kom når jeg kjørte programmet fra designeren. Når jeg kjørte programmet som vanlig, så fungerte allt fint. Regner med at det da kun er en exception som koderene av TADOTable har brukt til å gjøre en "IF" i sin kode.

Lenke til kommentar

Nå har jeg imidlertid et problem med å få tak i index navnene på tabellen. I hjelpesystemet står det at man kan bruke:

 

ADOTable.GetIndexNames(StringListe);

 

men det gir ingen resultater. StringListe.Count er 0 etter dette kallet.

 

Prøvde så å bruke "IndexDefs" slik:

ADOTable.IndexDefs.Update;

If ADOTable.IndexDefs.Count > 0 then ....

 

men også her får jeg ingen info om indexene (ADOTable.IndexDefs.Cound=0).

 

Når jeg kjører:

bOk := ADOTable.FindFirst;

så finner jeg recordene jeg skal, men får ikke angitt hvilken index jeg skal bruke.

 

Noen ide om hvorfor jeg ikke får tak i informasjon om de forskjellige indexene på tabellen(e) mine ?

 

Trenger info om indexer da programmet skal connecte til 2 forskjellige databaser som angir index navn på forskjellig måte. Trenger da å lage en mapping funksjon som mapper mellom de forskjellige navnene (slik at programmet som bruker klassen min, ikke trenger å vite hvilken databasemotor som det jobber mot).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...