[VB.NET]Dataadapter krijgt selectcommand niet uitgevoerd

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 19-09 20:48
Ik heb mijn dataadapter in een aparte klasse staan (sqlserver.vb).
Maar deze wil maar niet werken.
New toevoegen lukt niet, dan krijg je de melding mustinherit

http://www.imgme.nl/image...9517c4071c7ad77e9df37.jpg

Wanneer je het runt krijg je een nullreference exeption,ookals je erachter = nothing schrijft krijg je een
null reference exeption. De command word opgebouwd op een andere pagina. En deze wordt dan meegestuurd.

code:
1
2
Dim da as dataadapter
da = getdataadapter(command)



Dit gebeurd allemaal goed. Connectie gaat ook gewoon open. Maar dan het uitvoeren van (zie screen)
loopt gewoon helemaal mis. Ik heb deze analoog opgebouwd als daarboven de getdatareader.

code:
1
da.SelectCommand = command


Maar toch gaat er ergens iets fout. Iemand die me raad kan geven?

Acties:
  • 0 Henk 'm!

Verwijderd

Het is een vreemde techniek die je toepast. Ik ben zeker geen expert op dit gebied, maar de klasse DbDataAdapter is abstract, dus die kan je niet rechtstreeks gebruiken (zoals bij het toevoegen van New ook duidelijk aangegeven wordt met MustInherit).

Ook zou ik verwachten dat je een dataset gebruikt om de data in op te slaan die door het sqlcommando opgevraagd wordt. Dat zie ik nergens terug... maar ik herhaal dat ik jouw werkwijze niet ken, dus het kan aan mij liggen ook :D

Verder werk je met try/catch zoals het hoort, maar doe je niets met een eventuele exception die gevangen wordt...

Zelf werk ik met datasets en bijbehorende tableadapters. Dit zit ook allemaal in een aparte klasse dbmanager.vb. Ik werk ook met SQL Server, dus misschien kan ik helpen met een codevoorbeeld, als ik maar eens zou kunnen vinden wat de codetag is om code in een bericht te krijgen :D

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 24 juni 2009 @ 22:08:
Ik ben zeker geen expert op dit gebied, maar de klasse DbDataAdapter is abstract, dus die kan je niet rechtstreeks gebruiken (zoals bij het toevoegen van New ook duidelijk aangegeven wordt met MustInherit).
Zoals Hermanito al zegt, dit is een abstracte klasse. Ik zou gewoon een concrete Data Connector gebruiken. Ik gebruik zelf bijvoorbeeld de MySQL .NET connector. Ik weet niet welke database je wilt benaderen. Voor MSSQL kun je bijvoorbeeld het volgende doen om de DataAdapter te initialiseren (zit ook standaard in het framework):


C#:
1
SqlDataAdapter a = new SqlDataAdapter(c);


Daarna kun je deze DataAdapter vullen met:

C#:
1
a.Fill(d,"table");


EDIT: d is inderdaad de DataSet die dan gevuld gaat worden.
Verwijderd schreef op woensdag 24 juni 2009 @ 22:08:
Ik werk ook met SQL Server, dus misschien kan ik helpen met een codevoorbeeld, als ik maar eens zou kunnen vinden wat de codetag is om code in een bericht te krijgen
Overzicht van UBB-codes

Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 19-09 20:48
Ja ik zet dit nadien ook in een dataset.
Ik haal het gewoon via de klasse op en steek het dan pas in een dataset.

code:
1
2
da = getdataadapter(command)
da.fill( dataset, "Test")


Je moet gewoon (code) (/code) --> ( = [
En dan kan je makkelijk code plaatsen.

Acties:
  • 0 Henk 'm!

Verwijderd

Okee, iemand heeft dus sinds gisteren snel die code tag toegevoegd op de pagina met UBB-codes, ik had daar gekeken en heb die niet zien staan :+

Goed, mijn werkwijze is dus als volgt:
- functie schrijven in dbmanager.vb
- functie geeft een List(Of T) terug, gevuld met de gevraagde data, in business-objecten
- maakt gebruik van een vooraf gedefinieerde DataSet die de nodige tabellen en queries bevat

Codevoorbeeld:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Shared Function GetBooks(ByVal Pub As Publisher) As List(Of Book)
    Dim Books As New List(Of Book)
    Dim dataset As New BooksPublishers
    Dim adapter As New BooksPublishersTableAdapters.BooksTableAdapter
    Try
      adapter.FillByPublisher(dataset.Books, Pub.ID)
    Catch e As SqlClient.SqlException
      ShowDatabaseError(e)
    Finally
      adapter.Dispose()
    End Try
    For Each row As BooksPublishers.BooksRow In dataset.Books.Rows
      Dim boek As New Book(row.ID, row.Title, row.SubTitle, New ISBNNumber(row.ISBN10, row.ISBN13), row.Year.Year, row.Notes, _
      row.PublisherID, row.LanguageID, row.SerieID, row.CoverLocation)
      Books.Add(boek)
    Next
    Return Books
  End Function


dataset bevat in dit geval de tabellen Books en Publishers
omdat ik data vul in de Books tabel, gebruik ik de TableAdapter van Books (de tabel Books)
deze TableAdapter bevat de query FillByPublisher die 1 parameter nodig heeft, namelijk PublisherID
wanneer de query succesvol is, zit de gevraagde lijst met boeken nu in Books (de tabel Books)
(de ShowDatabaseError methode is een eigen methode en toont gewoon een messagebox met de foutmelding)
deze data zet ik om naar businessobjecten in de For Each... Next
en tenslotte return ik de lijst met businessobjecten die ik verder in het programma kan gebruiken.

Ik hoop dat dit helpt...

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 25 juni 2009 @ 11:07:
Okee, iemand heeft dus sinds gisteren snel die code tag toegevoegd op de pagina met UBB-codes, ik had daar gekeken en heb die niet zien staan :+
offtopic:
Die staat er toch echt al lang in, een uitgebreidere uitleg staat hier: Hoe post je code? / Hoe gebruik je de code tag?, en dat dateert ook al weer uit 2002 ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Sven_Vdb
  • Registratie: Januari 2006
  • Laatst online: 19-09 20:48
Heb nu alles verandert naar sqlcommand, sqldatareader, sqldataadapter. En nu werkt het allemaal mooi.
Project is nog van vorige collega geweest, dus niet altijd even simpel te doorspitten.

Maar om dan toch even wat duidelijk te maken voor mij.
Wat is dan juist het verschil tussen

Gewoon command,datareader,....
sqlcommand,sqldatareader,....
dbcommand,dbdatareader,.....

Sql zou ik nog kunnen denken voor access en msql omdat dit toch echte sql toepassingen zijn.
Maar wat is het verschil dan met andere?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Command, DataReader etc zijn de Abstracte base classes.

De SqlCommand etc. zijn de implementaties voor Sql Server. Zo heb je ook de OleDb implementaties ( OleDbCommand, OleDbDataReader, etc.. )

Om later makkelijker te kunnen switchen kun je het best overal de Abstracte base types gebruiken, en alleen bij het instantieren ( eventueel door een Factory ) de implementaties.

C#:
1
2
DbCommand myCommand = new SqlCommand();
DbConnection myConnection = new SqlDbConnection();

Dan is je code verder niet afhankelijk van de specifieke implementatie.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Woy schreef op donderdag 25 juni 2009 @ 14:17:
Om later makkelijker te kunnen switchen kun je het best overal de Abstracte base types gebruiken, en alleen bij het instantieren ( eventueel door een Factory ) de implementaties.

...

Dan is je code verder niet afhankelijk van de specifieke implementatie.
De vraag is al hierboven al beantwoord maar toch... als aanvulling op wat Woy schreef.

Om te kunnen switchen maak ik ook gebruik van een factory in mijn DAL, maar die retourneert alleen een interface voor de DAL objecten. Ik maak verder nooit gebruik van deze abstracte bass types (ik zie het gebruik hiervan in dit topic voor het eerst :) ), maar de concrete implementatie (zoals ik hierboven al aangaf).

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 25 juni 2009 @ 15:52:
[...]


De vraag is al hierboven al beantwoord maar toch... als aanvulling op wat Woy schreef.

Om te kunnen switchen maak ik ook gebruik van een factory in mijn DAL, maar die retourneert alleen een interface voor de DAL objecten. Ik maak verder nooit gebruik van deze abstracte bass types (ik zie het gebruik hiervan in dit topic voor het eerst :) ), maar de concrete implementatie (zoals ik hierboven al aangaf).
Het gebruik van de abstracte base-types is om dezelfde reden dat jij alleen interfaces naar je DAL objecten gebruikt. Je bent dan bij het gebruik niet gebonden aan de concrete implementatie, als je een concrete implementatie in een kleine scope gebruikt haalt dat niet zoveel uit, je kunt dan immers eenvoudig wijzigingen maken, maar als je de instanties ook doorgeeft in je data-laag creeer je dependencies die later misschien niet zo makkelijk meer te wijzigen zijn.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1