10. juli 2004 - 20:24Der er
19 kommentarer og 1 løsning
flere odbcCommands på samme connection
Hej!
Jeg er i gang med at lave et lille adm-sys.
Forbindelse til database får jeg på følgende måde: Jeg har en Controllerklasse der står for at oprette et objekt af typen "database". Constructoren i databaseklassen ser således ud:
private OdbcConnection con; public database() { this.con = new OdbcConnection(MyConString); }
Herefter kalder Controllerklassen database.Open() som ser sådan ud:
Herefter kalder Controllerklassen den ønskede metode på databaseobjektet og derefter kaldes Close() på objektet og forbindelsen lukkes. Når jeg vil trække data ud af databasen (eller putte noget i) så opretter jeg i hver metode i databaseklassen en OdbcCommand og en OdbcDataReader. Dette har nu vist sig at volde mig problemer :( Jeg har en metode i databaseklassen som kalder en anden metode i databaseklassen og dette gir mig en exception der lyder:
"There is already an open DataReader associated with this Connection which must be closed first."
Jeg er klar over at det er lidt et problem at jeg opretter OdbcDataReaders i hver metode. Hvordan ville I løses problemet ? Putte OdbcDataReaderen op i constructoren i databaseklassen? Det er mit umiddelbare bud, men kan det ikke også gi problemer ?
Håber I vil komme med et par gode forslag og lidt kritik på mit databaselag :)
public ArrayList GetAllFoobars() { // create OdbcCommand med SELECT // få OdbcDataReader via ExecuteQuery // hent alle data over som objekter i ArraryList // close OdbcDataReader // returner ArrayList }
Jeg forstår din GetAllFooBars() som at du, ligesom mig, ikke lader dine metoder oprette forbindelsen til databasen, men at den allerede er oprettet når dine metoder kaldes. Men det er jo lige netop det der går galt for mig. Jeg synes bare ikke det er særlig smart at lade hver metode oprette en forbindelse til databasen og udføre det den nu skal for derefter måske at kalde andre metoder der også åbner forbindelse. Men er det løsningen på mit problem måske ?!
Ovenstående forventer en connection lavet i constructor.
Men i virkeligheden kunne man ligeså godt lave en ny connection i selve metoden.
Når du opretter en .NET database connection så opretter du nemlig ikke nødvendigvis en fysisk database connection, da .NET connection klasserne har indbygget connection pool.
public ArrayList GetAllFoobars() { // create OdbcConnection // create OdbcCommand med SELECT // få OdbcDataReader via ExecuteQuery // hent alle data over som objekter i ArraryList // close OdbcDataReader // close OdbcConnection // returner ArrayList }
"two":
public ArrayList GetAllFooAndBars() { // create OdbcConnection 1 // create OdbcConnection 2 // create OdbcCommand 1 med SELECT // få OdbcDataReader 1 via ExecuteQuery // while løkke // { // hent data fra OdbcDataReader 1 // create OdbcCommand 2 med SELECT // få OdbcDataReader 2 via ExecuteQuery // hent data fra OdbcReader 2 // konstruere objekt fra de to readere og gem i ArrayList // close OdbcDataReader 2 // } // close OdbcDataReader 1 // close OdbcConnection 1 // close OdbcConnection 2 // returner ArrayList }
Jeg har sat hver metode til at lave en connection så nu virker det med readeren i det mindste... Men... Hvorfor dælen vil reader.GetString(3) (3 er en varchar og jeg bruger en MySql db) kaste en exception når der er en Null-værdi i feltet ?
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.