Just nu i M3-nätverket
Gå till innehåll

MySQL


Rest man Klaymen

Rekommendera Poster

Rest man Klaymen

Vet att många har frågat liknande frågor innan, men jag har googlat och sökt på eforum nu i flera timmar och ändå inte lyckats hämta en enda rad från min databas.

 

Helt ny på .NET men försöker i alla fall. Det jag vill göra är helt enkelt att hämta några rader från min MySQl 5-databas, loopa genom dem och skriva ut dem. Skriver i VB.

 

Har letat hur mycket som helst nu, så jag hoppas någon kan reda ut begreppen.

 

Jag antar att jag måste använda en ODBC-connection, och då måste jag importera System.Data.ODBC. Men hur gör jag för att få in resultatet i en lista? Recordset är väl inte rätt väg att gå, men jag får inte DataSet att fungera. Vad är allt jox med Fill() och liknande? Skulle det inte bli enklare i .NET än det var i gamla ASP? Som ni märker är jag totalförvirrad. Hur gör jag?

 

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

Vem har sagt att det skulle vara enklare? .Net är ju en enormt mycket mer omfattande och komplett utvecklingsplattform än VBScript, som bara är ett scriptspråk.

 

Det finns många sätt att göra det på. En variant är att använda en databound-control och koppla denna mot ex. en DataSet.

Ex.

     Dim conn As OleDbConnection = New OleDbConnection("Din connectionstring")
       Dim comm As OleDbCommand = New OleDbCommand("sp_DinSP", conn)
       Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(comm)
       Dim ds As DataSet = New DataSet("NyttDS")
       adapter.Fill(ds, "DinTabell")
       DataGridView1.DataSource = ds
       DataGridView1.DataMember = "DinTabell"
       DataGridView1.DataBind()

 

En annan metod är att använda en datareader och sedan fylla dina kontroller själv med data.

        Dim conn As OleDbConnection = New OleDbConnection("Din connectionstring")
       Dim comm As OleDbCommand = New OleDbCommand("sp_DinSP", conn)
       conn.Open()
       Dim dr As OleDbDataReader = comm.ExecuteReader()
       Do While dr.Read()
           Data = dr.GetInt32(0) ' Hämtar första fältet som är av typen Int
       Loop
       dr.Close()
       conn.Close()

 

[inlägget ändrat 2007-09-15 18:10:51 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Det är väl "enklare" på så sätt att man kan få olika saker att fungera direkt med .NET än att behöva lägga till komponeter osv... i Asp.

 

Vilken av metoderna nedan är att rekommendera och vad är respetive för- och nackdel?

(ska snart försöka lära mig .net så jag lära väl bombadera eforum snart med mina egna inlägg)

 

Kan man säga att Dataset är som GetRows() i asp?

Datareader är, som jag förstått innan "likartat" recordset i asp!?

För då är där ju stor skillnad :)

 

[inlägget ändrat 2007-09-15 18:40:54 av Micke_skane]

Länk till kommentar
Dela på andra webbplatser

Med datareader-metoden har du ju full kontroll på datan som hämtas och kan göra eventuella mer avancerade operationer på datan innan du använder den.

 

Databindning däremot är ju väldigt smidigt när man vill skapa en direkt avbildning av tabellinnehållet och dessutom tillåta uppdatering av rader (då krävs även att man skapar Update-, Insert- och Delete-instanser av DataCommand-klassen).

 

Det finns massor med andra sätt att skapa datakällor också, såväl disconnected som connected.

 

Observera att OleDb är valet för de flesta nya database utom Oracle och SQL Server (som har egna klasser för datahantering i namespace System.Data.OracleClient resp. System.Data.SqlClient)

 

För äldre databaser där nyare db-providers saknas kan man falla tillbaka på odbc, men enbart då.

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Ok, nu är jag med lite mer.

 

Men vad menas med "sp_DinSP", vad ska jag skriva där?

 

Var skriver jag mina SQL-satser?

 

Hur använder jag OleDbDataReader? Där jag förut skrev RS("fältnamn"), vad skriver jag nu?

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

Ursäkta Rest man Klaymen att vi fortsätter skriva i din tråd men du kanske också har nytta av diskutionen, säg till annars!

 

Så Databinder innebär att man hämtar ut datan och lagrar den och sen kan man påverka det innehållet med olika sql-frågor, utan att samtala med databasen?

 

Länk till kommentar
Dela på andra webbplatser

Kan man säga att Dataset är som GetRows() i asp?

Oj, nä, verkligen inte. En DataSet är en datarepository/datacache som du kan använda som källa utan att ha den minsta aning var datan kommer ifrån. Dess DataTables ex. kan vara fyllda manuellt, via en XML-fil eller databas. Du kan skapa relationer mellan de olika tabellerna.

GetRows returnerar ju inget annat än en simpel array av arrayer.

 

Vad gäller datareaders så är väl grundtanken densamma som för recordsets, men är mycket hårdare typat och har mkt mer funktionalitet.

 

ADO.Net är ju lite grann baserat på ADO, men skillnaderna är väldigt stora.

 

Länk till kommentar
Dela på andra webbplatser

Oekj ,det är inte "samma sak" men man kan använda det "på samma sätt", att man hämtar ut datan och lagrar den, stänger databaskopplingen så fort det går och Sen använder datan där man vill använda den?

Är jag ute och reser, mot nya zeeland?

 

Länk till kommentar
Dela på andra webbplatser

Var skriver jag mina SQL-satser?

Rena SQL-satser bör du alltid undvika, dels för att nyttjandet av stored procedures är båda snabbare, säkrare och långt mer skalbara. sp_DinSP är således din stored procedure. Glömde förresten en rad i koden, man måste tala om för sitt Command-objekt vilken typ av data den representerar. I det här fallet skall det alltså vara

comm.CommandType=CommandType.StoredProcedure

 

Vill du hellre använda en vanlig sql-fråga så använder du CommandType.Text istället.

 

Hur använder jag OleDbDataReader? Där jag förut skrev RS("fältnamn"), vad skriver jag nu?

Antingen hämtar du datan via namn

dr("Fältnamn")

men det är rekommenderat att du hämtar den med rätt typmetod istället:

 

Dim n as Int32=dr.GetInt32(0)

Inom parentes anger du då indexet för den kolumn du vill hämta

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Då bör jag alltså läsa på mer om stored procedures.

 

Dim n as Int32=dr.GetInt32(0) hämtar om jag fattat rätt det första värdet i kollektionen som är av typen int. Detta på rad 1 alltså? Så om jag har 3 kolumner och alla är av typen int så hämtar jag dem med

dr.GetInt32(0), dr.GetInt32(1), dr.GetInt32(2)?

 

Och sedan kommer nästa rad på nästa varv i loopen?

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

så hämtar jag dem med

dr.GetInt32(0), dr.GetInt32(1), dr.GetInt32(2)?

Den måste jag svara på för jag är rätt säker på det nu, och svaret är Japp :)

 

Länk till kommentar
Dela på andra webbplatser

Så Databinder innebär att man hämtar ut datan och lagrar den och sen kan man påverka det innehållet med olika sql-frågor, utan att samtala med databasen?

Databinding innebär enkelt förklarat att ex. en kontroll har en koppling mot en datakälla/DataSource. Denna kan du sedan filtrera och sortera lokalt.

 

Ex. filtering+sortering

Dim dv As DataView = New DataView(ds.Tables("DinTabell"), "ID>10", "Datum ASC", DataViewRowState.CurrentRows)

Sedan kan du använda denna DataView som datakälla (istället för en DataSource som tidigare)

 

Länk till kommentar
Dela på andra webbplatser

Då liknar det att man kan sortera recordset i asp, efter man fyllt det.

Rätt!?

Eller kan man säga att detta ersätter en utökad sql-sats med diverse filtreringsegenskaper?

[inlägget ändrat 2007-09-15 19:08:18 av Micke_skane]

Länk till kommentar
Dela på andra webbplatser

Oekj ,det är inte "samma sak" men man kan använda det "på samma sätt", att man hämtar ut datan och lagrar den, stänger databaskopplingen så fort det går och Sen använder datan där man vill använda den?

Ja precis. Du behöver dessutom inte fylla den med data från en databas eller xml-fil utan kan ex. skapa en lokal DataTable, lägga till kolumner och rader manuellt. Som en smidig och sökbar lagring av data i ditt program (även om jag aldrig använder det så)

 

Länk till kommentar
Dela på andra webbplatser

Så om jag har 3 kolumner och alla är av typen int så hämtar jag dem med

dr.GetInt32(0), dr.GetInt32(1), dr.GetInt32(2)?

Precis.

 

Dim n as Int32=dr.GetInt32(0) hämtar om jag fattat rätt det första värdet i kollektionen som är av typen int.

Det hämtar det första värdet i kollektionen punkt slut, men gör en typkonvertering i samma veva. Så om fältet råkar vara av Varchar kommer du får ett typfel.

 

Och sedan kommer nästa rad på nästa varv i loopen?

Ja, för varje gång dr.Read() anropas så stegas det vidare, i stil med MoveNext för ett recordset

 

Länk till kommentar
Dela på andra webbplatser

Börjar bli lite rörig tråd så sista inlägget för mig:

 

filtering+sortering

Eller kan man säga att detta ersätter en utökad sql-sats med diverse filtreringsegenskaper?

 

 

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen
Rena SQL-satser bör du alltid undvika, dels för att nyttjandet av stored procedures är båda snabbare, säkrare och långt mer skalbara.

Jag ska alltså skapa en stored procedure för varje SQL-sats som jag behöver i min applikation? Om det bara rör sig om att hämta ett antal fält, eller ett COUNT()-värde, är det inte smidigare att skicka en kort SQl-sträng till databasen då? Eller är SP att föredra i alla lägen.

Vet att det är lite OT men ändå relaterat.

 

/ RMK

Jobbiga_färger.

 

Länk till kommentar
Dela på andra webbplatser

Eller kan man säga att detta ersätter en utökad sql-sats med diverse filtreringsegenskaper?

En DataView kan du jämföra med en databas-view, dvs. en avbildning av en tabells data. En DataView kan även innehålla multipla värden för varje kolumn - hur fältdata såg ut från början, hur den ser ut för tillfället och hur den skulle se ut efter en ändring har commitats.

Vidare kan du då på denna view göra sorteringar och filteringar som sagt.

Ganska mycket mer avancerad som sagt.

 

Länk till kommentar
Dela på andra webbplatser

är det inte smidigare att skicka en kort SQl-sträng till databasen då?

Latare kanske =) Använder du stored procedure så kompileras frågorna och exekverar snabbare. Dessutom säkrar du dig mycket mer mot injection-attacker om du använder SP:s. Vidare gör du applikationen skalbar och oberoende av vilken databashanterare du använder. Använder du ex. en sql-variant som inte är kompatibel med andra databaser och sedan en dag vill byta (ex. från mysql till sql server) så måste du alltså sitta och gå igenom all din kod och fixa till detta. Mycket simplare om du bara behöver skriva om dina sp:s. Dessutom kan du i SP:s använda dig av transaktionshantering, vilket är extremt viktigt i framförallt webbapplikationer.

 

Det är att föredra i princip alla lägen ja.

 

[inlägget ändrat 2007-09-15 19:21:45 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...