Avatar billede cogitans Nybegynder
24. juli 2007 - 18:02 Der 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....?
Avatar billede kalp Novice
24. juli 2007 - 18:05 #1
har ikke rigtig kigget på koden.. blot din kommentar.

Du skriver, at du ikke fårnoget fra Session["text"]
så bør du prøve med Session["text1"]
som du gemmer i.

virker det stadig ikke så er det en bedre ide, at skrive denne til

Session.Add("text1", (string)set1.Tables[0].Rows[0][0].ToString());
Avatar billede cogitans Nybegynder
24. juli 2007 - 18:17 #2
Ang. Session["text"] og session["text1"] så var det blot en skrivefejl i kampens hede, da jeg skrev spørgsmålet.

Derimod er fejlen nok som du skriver i den sidste linie. Men hvad med selve databaseadgangskoden? Ser den rigtig nok ud mht. databasenavn osv.?
Avatar billede cogitans Nybegynder
24. juli 2007 - 19:13 #3
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å :-)
Avatar billede kalp Novice
24. juli 2007 - 20:45 #4
det skal være
set1.Tables[0].Rows[0][0].ToString());

nu 2 [] er celler!!

hvis din SQL er korrekt så er problemet måske din connectionstring...
jeg har ikke koblet mig op imod en access db.. plejer at gøre det imod mssql.

men tjek hvordan du bør gøre det via.
http://www.connectionstrings.com/
Avatar billede cogitans Nybegynder
25. juli 2007 - 17:43 #5
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?
Avatar billede kalp Novice
25. juli 2007 - 17:51 #6
der skal mere kode på bordet for at kunne svare på det.

en nemmere ting er, at fjerne eventet.. og sætte det på igen.

virker det stadig ikke så prøv at sætte et breakpoint i metoden for at se om den går der ind overhovedet.

kan du heller ikke det så er det nok fordi du har lavet noget i pageload som gør, at siden ikke loades korrekt.

f.eks skrevet

if(!IsPostBack)
{
  og alt koden herinde
}

hvis du har nogle kontroller f.eks så skal de loades igen og må derfor ikke lægges derind.
Avatar billede cogitans Nybegynder
25. juli 2007 - 18:40 #7
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...?
Avatar billede kalp Novice
25. juli 2007 - 19:06 #8
prøv at lave sidste linje på denne måde


Session["text"] = set1.Tables[0].Rows[0][0].ToString();
Avatar billede cogitans Nybegynder
25. juli 2007 - 19:43 #9
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????
Avatar billede kalp Novice
25. juli 2007 - 19:49 #10
kan du ikke vise mig hvordan koden ser ud med dine trycatch og console write lines?
Avatar billede cogitans Nybegynder
25. juli 2007 - 20:17 #11
Her er begyndelsen af koden og slutningen af den:

protected void Button1_Click(object sender, EventArgs e)
{
try
  {
    Console.Out.WriteLine("\n*********************************\n");
    Console.Out.WriteLine("INDE"); Console.In.ReadLine();
    Console.Out.WriteLine("\n*********************************\n");
    SqlCommand com1 = new SqlCommand("SELECT...........
.
.
.
catch (Exception ex)
{
  Console.Out.WriteLine("\n*********************************\n");
  Console.Out.WriteLine("\n" + ex.ToString() + "\n");
  Console.Out.WriteLine("\n*********************************\n");
}
}
Avatar billede neoman Novice
25. juli 2007 - 21:24 #12
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:)
Avatar billede kalp Novice
25. juli 2007 - 21:56 #13
og jeg tror du har helt ret neoman.
Avatar billede cogitans Nybegynder
25. juli 2007 - 22:41 #14
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?
Avatar billede kalp Novice
26. juli 2007 - 00:11 #15
hvis din debugger stepper hen over de der linjer så bliver de også udskrevet - men dig som kigger i det forkerte vindue.

så når du debugger så burde du kunne se præcist hvad der sker.
Avatar billede neoman Novice
26. juli 2007 - 11:11 #16
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
Avatar billede kalp Novice
26. juli 2007 - 11:37 #17
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.
Avatar billede neoman Novice
26. juli 2007 - 11:49 #18
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.
Avatar billede kalp Novice
26. juli 2007 - 11:56 #19
neoman >>

jeg højreklikker på "call stack" vinduet og vælge "Go to assembly".
så kan du se hvad der er udskrevet.
Avatar billede neoman Novice
26. juli 2007 - 11:57 #20
aha - så det er der hunden har begravet sin humle... eller MS sin console , hehe:) Det vil jeg fluks prøve:)
Avatar billede kalp Novice
26. juli 2007 - 11:58 #21
neoman >> well... I think so. Det kan også være jeg har det fra min Java verden hvor det bliver udskrevet fint:D
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:01 #22
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".
Avatar billede neoman Novice
26. juli 2007 - 12:19 #23
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 ?
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:25 #24
Ja, jeg skulle også lige til at skrive, at jeg nok lige skulle prøve med oledb...
Avatar billede kalp Novice
26. juli 2007 - 12:25 #25
neoman >>

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!
Avatar billede neoman Novice
26. juli 2007 - 12:26 #26
Ja så skal du også have Imports System... et eller andet OleDb stuff som du kan få op i din intellisense
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:27 #27
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.
Avatar billede neoman Novice
26. juli 2007 - 12:28 #28
kalp - ahem, jeg laver en asp.net ting, kan jeg så stadig ha en console.write ?
Avatar billede kalp Novice
26. juli 2007 - 12:32 #29
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
Avatar billede neoman Novice
26. juli 2007 - 12:34 #30
kalp>Jeg holder mig til det gennemprøvede så - Tænkte nok at jeg var dum men ikke helt sååå dum :)

cogitans: findes der  en .net provider til din OpenSource-db-ting ?
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:37 #31
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?
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:39 #32
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....
Avatar billede neoman Novice
26. juli 2007 - 12:40 #33
Jeg ved faktisk ikke hvordan det funker med en access fil uden at man selv har access installeret :-(
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:41 #34
Jeg tror, at 12:39:38 lyder som den rigtige forklaring...
Avatar billede neoman Novice
26. juli 2007 - 12:42 #35
kan godt være...jeg tror ikke du kommer nogen vegne med SqlClient.
Avatar billede neoman Novice
26. juli 2007 - 12:44 #36
Dim myDBconnection As OleDbConnection = New OleDbConnection( _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & HttpContext.Current.Server.MapPath("~/App_Data/navnetpådb.mdb"))
            myDBconnection.Open()
Avatar billede cogitans Nybegynder
26. juli 2007 - 12:56 #37
Tak, men det der VB-halløj dér, det gør jeg ikke i :-)
Kan man ikke gemme outputtet fra en OleDbCommand i et dataset?
Avatar billede cogitans Nybegynder
26. juli 2007 - 13:00 #38
Ah, men jeg skal da vel ikke bruge et dataset, når sql'en er "SELECT Count..." ?
Avatar billede neoman Novice
26. juli 2007 - 13:00 #39
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
Avatar billede cogitans Nybegynder
26. juli 2007 - 13:02 #40
Ja, for nu får jeg også fejlen:
System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.Data.DataSet'.
Avatar billede cogitans Nybegynder
26. juli 2007 - 13:03 #41
13:00:52
Det er garanteret ikke så svært endda. Jeg har blot aldrig forsøgt.
Avatar billede neoman Novice
26. juli 2007 - 13:06 #42
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
Avatar billede cogitans Nybegynder
26. juli 2007 - 13:16 #43
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 :-)
Avatar billede cogitans Nybegynder
26. juli 2007 - 13:20 #44
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)
Avatar billede cogitans Nybegynder
26. juli 2007 - 17:37 #45
Da der åbenbart ikke er nogle indvendelser imod dette, må Neoman og kalp lægge et svar hver...
Avatar billede kalp Novice
26. juli 2007 - 22:51 #46
cogitans >>

Det er udelukkende dig, som bestemmer til hvem og hvordan point skal fordeles uanset min eller andres mening til det:D
Avatar billede cogitans Nybegynder
26. juli 2007 - 23:27 #47
;-)
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...
Avatar billede kalp Novice
26. juli 2007 - 23:29 #48
De personer har misforstået reglerne:D

De er ellers lige blevet genopfrisket under "nyheder":)
Avatar billede neoman Novice
27. juli 2007 - 11:57 #49
svar
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
Kurser inden for grundlæggende programmering

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