cazber Skrevet 18. januar 2008 Del Skrevet 18. januar 2008 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
Format71 Skrevet 18. januar 2008 Del Skrevet 18. januar 2008 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
cazber Skrevet 21. januar 2008 Forfatter Del Skrevet 21. januar 2008 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
cazber Skrevet 21. januar 2008 Forfatter Del Skrevet 21. januar 2008 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
cazber Skrevet 22. januar 2008 Forfatter Del Skrevet 22. januar 2008 Fant en side på nettet som sier at indekser ikke er mulig å bruke med TADO komponentene mot SQL server, så jeg har gitt opp, og prøver BDE i stedet. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå