Avatar billede the_julle Praktikant
22. februar 2012 - 11:03 Der er 8 kommentarer og
1 løsning

'Fill' database: invalid handle?

Hej alle.

Jeg tilgår en database, laver en select, bruger Fill og arbejder herefter med dataen. I nedenstående eksempel er data en liste af en liste af typen string (list<list<string>>):

for (int i = 0; i < data.Count; i++)
{
sstring = "SELECT Kol1, Kol2, Kol3 FROM tabel3 " +
                "WHERE Kol4='" + data[i][2].ToString() + "'" +
                " ORDER BY Kol3";

dbdt = new DataTable();
dbAdapter = new OdbcDataAdapter(sstring, myConnect);
dbAdapter.Fill(dbdt);

foreach (DataRow myrow in dbdt.Rows)
{   
    // Do something
}
dbAdapter.Dispose();
}

Ovenstående gør jeg et par gange, dog med en forskellig string.

Jeg får følgende fejl, som "peger" på linjen med Fill:
INVALID_HANDLE - unable to allocate an environment handle.

Tilgår jeg databasen for mange gange, uden at release resurserne?
Avatar billede the_julle Praktikant
22. februar 2012 - 11:05 #1
Lige en rettelse. dbAdapter.Dispose() står IKKE inde i for-løkken, men lige efter. Den kaldes altså kun 1 gang.
Avatar billede the_julle Praktikant
22. februar 2012 - 11:09 #2
Jeg forsøgte lige at sætte dbAdapter.Dispose() ind i for-løkken, men det gjorde altså ingen forskel...

Jeg laver jo en new DataTable og OdbcDataAdapter mange gange. Det er vel egentlig ikke meningen?
Avatar billede the_julle Praktikant
22. februar 2012 - 14:22 #3
Jeg har efterhånden fundet frem til, at det må være noget med at databasen er optaget når denne fejl kommer. Derfor har jeg lavet denne kode:

while (dbdt.Rows.Count == 0)
{
    try
    {
        dbAdapter.Fill(dbdt);
    }
    catch (Exception err)
    {
        //...
    }

}

På den møde forsøges der at lave en Fill på databasen, indtil der er noget i den.

Eneste problem med denne løsning er, at hvis der helt korrekt ikke er noget i databasen ender man i en uendelig løkke.

Er der ikke et kald, som kan checke om, Fill-operationen lykkedes? Jeg kiggede lidt på Fillerror, men tror umiddelbart ikke jeg kan bruge den?
Avatar billede Syska Mester
22. februar 2012 - 14:27 #4
Det virker som en løsning man skal holde sig fra.

Hvad database snakker du med? Virker din overstående kode?

Får du virkelig ikke andre fejl?
Avatar billede the_julle Praktikant
22. februar 2012 - 14:49 #5
Ja, det er jeg enig i. Jeg har bare lige prøve at gøre sådan, da jeg er ved at være lidt frustreret over den fejl :)

Hvad mener du med hvad database? Det er en almindelig SQL-database, hvis det er det du spørger efter.

Nix, ingen andre fejl. Det er også kun hver anden gang fejlen kommer. Resten af gangene kører programmet der ud af, og giver mig det ønskede output. Jeg har ikke rigtig kunne gennemskue hvad der udløser fejlen.
Avatar billede Syska Mester
22. februar 2012 - 15:44 #6
Så ville jeg nok bruge http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx

SqlDataAdapter i stedet for ODBCDataAdapter hvis du alligevel er på en MSSQL server.

Dette var nemlig grunden til at jeg spurgte.
Avatar billede the_julle Praktikant
22. februar 2012 - 16:44 #7
På det måde :)

Der bruges Odbc til at forbinde til databasen (noget med netværket), så jeg er nok nød til at bruge OdbcDataAdapter.
Avatar billede the_julle Praktikant
24. februar 2012 - 10:27 #8
\\ Lukker tråden nu.

Har gjort som beskrevet i #3, og det fungere helt fint.
Avatar billede Syska Mester
24. februar 2012 - 11:13 #9
I så fald ville jeg nok implmentere en counter, så den max prøver X antal gange.

mvh
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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