19. maj 2011 - 22:59Der er
21 kommentarer og 1 løsning
SQL og Database
Håber her er nogle der kan hjælpe lidt med hvordan jeg læser rækker ud af en access database med SQL kommandoer.
Jeg har en stor database med mange kolonner og rækker, jeg vil gerne søge på indholdet af en bestemt kolonne, og hver gang det søgte findes, skal hele rækker printes ud i et listview.
Håber i forstår. På forhånd tak
Jeg har følgende kode.
Mdbsti = Application.StartupPath + (char)92 + "Database.mdb"; MessageBox.Show(Mdbsti); OleDbConnection MyConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; User Id=; Password=; Data Source=" + Mdbsti); OleDbCommand odbcom = new OleDbCommand("SELECT * FROM Film",MyConnection);
MyConnection.Open();
OleDbDataReader myReader = odbcom.ExecuteReader(CommandBehavior.SingleRow); if (!myReader.IsClosed) { switch (value) { case 1: odbcom.CommandText = searchFor; myReader.Close(); var rec = odbcom.ExecuteNonQuery(); break; case 2: odbcom.CommandText = searchFor; rec=odbcom.ExecuteNonQuery(); break; case 3: odbcom.CommandText = searchFor; rec=odbcom.ExecuteNonQuery(); break; }
Nedenstående er ikke testet. Jeg har skrevet direkte i tekstboksen. Men du skal gøre noget lignende dette:
Mdbsti = Application.StartupPath + "\\Database.mdb"; using (OleDbConnection MyConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; User Id=; Password=; Data Source=" + Mdbsti)) using (OleDbCommand odbcom = MyConnection.CreateCommand()) { odbcom.CommandText = "SELECT * FROM Film where title = ?"; odbcom.Parameters.Add("title", "Ghost Busters");
using(...) blokken gør, at når koden kommer ud af blokken, bliver Dispose på objekterne i blokken kaldt. Det vil altså sige, i dette tilfælde, at Dispose på MyConnection og odbcom bliver kaldt. Dette vil lukke din connection (Derfor behøver du ikke kalde Close).
I min løsning går jeg ud fra at du søger på title-kolonnen i databasen (Hvis du altså har sådan en), og at du også har en id kolonne.
Den henter ikke alle film ind i c# programmet, for at søge igennem dem der. I stedet er der specificeret i sql kommandoen, hvad det er du søger efter.
Tak Tak det virker bare super. Kender du denne fejl Objektreferencen er ikke indstillet til en forekomst af et objekt. JEg får denne fejl når jeg via et event vil skrive til listview1 fejlen kommer når jeg kalder metoden med alle data fra databasen.
Ja, den fejl kender jeg. jeg tror det er den hyppigste fejlmeddelelse i .NET :)
Det betyder at du prøver at gøre noget på et object som er NULL. Hvis eksempeltvist at "spilletid" parameteren til UpdateListView metoden er NULL, vil du få denne fejl, fordi du kalder spilletid.ToString(). Du kan ikke kalde ToString() på NULL.
Højest sandsynlig har du et tomt felt i databasen. Når det kommer ind i dit program, er bliver variablen NULL.
Når du programmere i Visual Studio, fortæller den dig på præcist hvilken linje i koden fejlen sker, dette bør give dig en pegepind på hvilken parameter som er NULL.
Fejlen bliver kaldt fordi du kalder en metode på et objekt der er null. Det er ganske sikkert.
Brug debuggeren i Visual Studio, eksekver koden linje for linje, følg med på hvad alle variabler indeholder. Så finder du helt sikkert fejlen. Dette er en god øvelse i debugging :) noget som alle skal igennem.
Jeg kan desværre ikke se hvad fejlen er, ud fra den information jeg har.
Der er ikke andet for end lave en step by step debugging igennem din kode. Find ud af præcist hvornår den fejler og hvor den fejler. Sæt et breakpoint i koden, så den breaker lige før den fejler. Tjek at alle variabler er i orden. Læs hele fejlmeddelelsen, også det der står i "inner exception".
Hvis du til død og pine ikke finder ud af det, så zip hele projektet inklusiv database, og læg det op på en server hvor jeg kan downloade det. eksempeltvis http://www.easy-share.com/ . Så skal jeg prøve at finde fejlen.
På linje 36 i Form1.cs sætter du eventet UpdateListView på den instans af DatabaseConnection klassen som hedder dbc, og ligger lokalt i Form1.
Inde i Title klassen opretter du en anden instans af DatabaseConnection klassen. Og det er denne instans du kalder DatabaseConnectionRead metoden på. Og denne instans af klassen, har ikke fået tildelt nogen delegate til UpdateListView eventet.
Du retter det enkelt ved at fjerne databasecon variablen fra Title klassen, og i stedet have den som parameter i Find_Title metoden. Title klassen kommer til at se sådan ud:
class Title { public String Title1;
public void Find_Title(String xTitle, DatabaseConnection databasecon) { if (xTitle.Contains("%")) { Title1 = "SELECT * FROM Film WHERE Title LIKE '" + xTitle + "'";//s%' }
else if (!xTitle.Contains("%")) { Title1 = "SELECT * FROM Film WHERE Title='" + xTitle + "'"; } databasecon.DatabaseConnectionRead(2, Title1); } }
På linje 40 i Form1.cs, tilføjer du dbc til metodekaldet:
if (!textBox1.Text.Equals("")) { t.Find_Title(textBox1.Text, this.dbc); }
Gør tilsvarende for Film og Medvirkende klasserne.
Hvis jeg ellers skal komme med lidt konstruktiv kritik, så tror jeg du gør dette en del mere kompliceret end det egentlig er.
Hvis du har lyst, kan jeg godt lave et lille eksempel på, hvordan jeg ville have lavet projektet? Og dette er på en måde, jeg tror de fleste vil synes er lettere at læse og forstå.
ja, men det giver mig denne fejl Error 1 Inconsistent accessibility: parameter type 'FilmDatabase.DatabaseConnection' is less accessible than method 'FilmDatabase.IGenre.getGenre(string, FilmDatabase.DatabaseConnection)'
Jeg har lavet et lille eksempel til dig, men jeg har kun VS2010, da jeg måtte reformatere for ikke så lang tid siden. Men VS2008 kan ikke åbne VS2010 solutions.
Hehe, her kommer svaret. Jeg har lagt en besked i din inbox med et link.
:)
Synes godt om
Ny brugerNybegynder
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.