24. juli 2007 - 18:02Der er
47 kommentarer og 2 løsninger
Databaseadgangsproblemer igen igen
Jeg har lavet lidt kode, som skal udtage informationer fra en database, lave en simpel beregning, og vise resultatet. Her er koden:
SqlCommand com1 = new SqlCommand("SELECT Count(biler.maerke) AS CountOfCars FROM biler HAVING ((biler.dato)>='" + TextBox1.Text.ToString() + "' AND (biler.dato)<='" + TextBox2.Text.ToString() + "' AND ((biler.Type)=1))"); com1.Connection = new SqlConnection("DataBase=biler;Server=bildatabase.mdb;"); DataSet set1 = new DataSet(); SqlDataAdapter adapter1 = new SqlDataAdapter(); adapter1.SelectCommand = com1; adapter1.Fill(set1); Session.Add("text1", (string)set1.Tables[0].Rows[0].ToString());
Hvorfor fungerer denne lille kodestump ikke? Ved "page_load" tager jeg data fra Session["text"], og sætter ind i et tekstfelt, men intet sker....?
Næh, det ser heller ikke ud til, at ...Rows[0][0]... fungerer. Hvis der var tale om et array, så fungerede løsningen nok, men når der er tale om row, så er det da kun 1 dimentionelt. Det synes Visual Studio 2005 i hvert fald også :-)
Jeg har sat nogle Console.out.writeline() ind i click-funktionen, hvor al databaseadgangen findes. Og jeg kan ikke se nogle udskrifter i output-vinduet, som der da burde være. Hvordan kan dette være? Det er en ganske almindelig knap, som har "click=Button1_click", som også er den metode, hvor al funktionalitteten er?
Nu har jeg sat breakpoints op, og funktionen bliver kald - også helt til ende. Men den sidste linie i funktionen havde jeg sat et breakpoint på, og når der stoppes ved den linie, og output-vinduet checkes, så er den sidste linie: A first change exception of type "System.ArgumentException" occured in System.Data.dll
Kan man finde ud af, hvad fejlen skyldes? For en sikkerhedsskyld har jeg sat al kode i button1_click ind i en try-catch, men exception'en fanges jo så ikke i den...?
Jeg tror ikke, at problemet ligger i, hvordan der gemmes i Sessionen - i hvert fald ikke det første problem. For både før og efter linien med sessionen er der Console.out.writelines, som ikke giver noget output. Jeg har netop lige prøvet, at sætte et breakpoint inde i catch-delen af try-catch. Og selvom der hele tiden har stået en linie i derinde, hvor exceptionen skrives ud, så er det aldrig kommet ud. Så altså bliver der både kastet en exception af, på nuværende, uforklarlige grunde, samt at "console.out.writeline()"-kommandoerne ikke bliver korrekt ekserkveret. Hmm????
Interesting - er der noget af din kode som virker ? F.eks new sqlconnection ? For mig bekendt er SQLClient gift med SM Sql ( også kendt som MS Sql), mens til access, som det ser ud til at du prøver at snakke med, så plejer man at bruge OleDb-stuff:)
Jeg kan også huske noget om, at jeg altid har brugt OleDb. Men da jeg har indtrykket af, at det var noget langsommere end så meget andet, har jeg forsøgt nogle andre forbindelsestyper. Men...der bliver stadig ikke udskrevet noget i output-vinduet. Ikke engang readLine bliver afviklet. Dette kan vel ikke være pga senere kode, som ikke er kompatibel med den aktuelle database?
Jeg kunne ikke finde ud af at skrive til Console og gad ikke spilde mere tid på at finde ud af det, så i stedet for bruger jeg System.Diagnostics.Debug.Write(myOutputString) som skriver til output vinduet
neoman >> det er helt klart også min foretrukne! men da den ikke fungerer hvis en solution er sat i "release" mode så kan man være tvunget til f.eks console.write line:D
jeg kører ofte med debug direktiver så engang imellem kan jeg komme ud for, at noget fejler i release-mode men ikke i debug.
Ok - educate me: foruden at kalde Console.write("blah"), hvad skal man gøre for at se outputtet ? Det var det jeg strandede på i sin tid, og har benyttet debug.write ever since.
Jeg tror også, at den nemmeste metode er debug'eren. Når jeg bruger den, så får jeg to fejl ud. Den første bliver kastet uden, at den bliver fanget i catch-delen, hvilket da egentlig ikke burde kunne forekomme (?). Den exception lyder: A first change exception of type "System.ArgumentException" occured in System.Data.dll
Ang. den fejl har jeg været inde i Access-databasen, og manuelt sørge for på filen, at alle har adgang til den. Muligvis har jeg ikke angivet stien fuldt ud til den?
Fejl nummer 2, som fanges i catch, lyder: System.ArgumentException: Keyword not supported: 'provider'.
Jeg har copy-pastet sætningen fra connectionsstrings.com, og kan ikke se, hvad fejlen skulle være. For det er da en access-fil, når den er af typen "mdb".
Kører du stadig med SQlclient ? Prøv at replace alt "SQL med "OleDB".
Tillige kan du dobbeltklikke på din access-db i din solution explorer. Den vil så åbne DB'en, men luk den bare igen. Nu står du i din server explorer, og når du klikker på din access db, så kan du se dens tabeller. Træk en tabel direkte ind i designeren - så laver den selv alt det nødvendige, og din tabel ligger i et gridview fordret af en AccessDatasource. Så kan du "take it from there"
kalp: Jeg behøve en idiots guide til dette her : Når min løsning kører, så klikker jeg som en gal mens jeg står inde i Stack Trace vinduet uden større effekt. Hvordan gør man det rigtigt skridt for skridt ?
jeg tror det kan være ligemeget med den fremgangsmåde - ser ud til den viser koden i assembler form (delvist) og ikke andet.
du kan gøre noget måske simplere (afhængig af din løsning!) hvis du bare vil se alt du har lavet til Console.WriteLine så højreklik på din projekt fil (ikke solution fil) og vælge egenskaber. Her kan du set et punkt der hedder "Output type:" den står til Windows application. Ændre den tin console application så burde du kun få en udskrift over alle console writelines!
Jeg har desvære ikke installeret Access lige nu, så jeg kan derfor tilsyneladende ikke blot dobbeltklikke på filen. Jeg har installeret OpenSource, men det er ikke lykkedes mig, at registrere déns access-åbner til mdb-filerne.
neoman >> he he:D der tror jeg du skal holde dig til System.Diagnostics.Debug.Write eller til new System.Diagnostics.TextWriterTraceListener(xxx); hvor output gemmes på fil:D
Jeg ved ikke, om der findes en provider til OpenOffice.org 2.1. Men filen er jo lavet i Access (da det er en gammel fil), så provideres burde vel stadig være access?
Kan det være fordi, at jeg jo ikke har lavet OleDb'er endnu, og det derfor ikke kompatibelt at skrive således: com1.Connection = new SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Dat....
forstår ikke dit indlæg 12:56:00 - hvor svært er det at omskrive til C# ?
Og du kan da lave alle de ting du normalt laver med sql clienten, så hvis du kan finde ud af at få data ind i et dataset fra sql så er det 100 % det samme fra oledb - der findes alle de normale sql-ting, blot med OleDb-prefix
Så er vi vist nået dertil hvor du selv skal læse lidt om data. Gå ind på msdn, der er faktisk mange gode forklaringer med udganspunkt herfra http://msdn2.microsoft.com/en-us/library/e80y5yhx(vs.80).aspx
Nu er problemet vist løst mht databaseadgang. Nu er problemet bare, at få vist det udtrukne på siden. Dertil har jeg brugt Session og så en Server.Transfer("siden"). Og server.transfer giver en fejl med: System.Threading.ThreadAbortException: Thread was being aborted. Det er vist noget med en virtuel sti. Men det er et helt andet problem, som jeg vist hellere må starte et andet spørgsmål op om :-)
Så fejlen var oprindeligt connectionstring'en. Og det var enten kalp 24/07-2007 20:45:41 eller Neoman 25/07-2007 21:24:28. Reelt er det vel kalp, som skal have pointene? (selvom der også var mange andre kommentarer, som var interessante)
;-) Ja, det vil jeg jo også mene, men der er nogle personer, som har givet mig en dårlig anmeldelse, netop fordi jeg ikke var tilfreds med resultattet af det aktuelle spørgsmål. Så derfor spørger jeg venligst folket, og de er nogenlunde enige i min holdninger, hvorefter der er mulighed for gensidig forklaring. That's all folks...
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.