[.NET] Custom dataset AddRow probleem

Pagina: 1
Acties:

  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Met behulp van VS 2003 (Visual studio 2003) heb ik een eigen Dataset aangemaakt. VS 2003 heeft op basis van mijn SQL Tabel Users een XSD diagram aangemaakt. Mijn users tabel bevat het volgende:

ID [INDENTITY] (laten we zeggen autonumber)
GroupID int (FK naar Group-tabel ID, mag null zijn)
Name varchar (mag null zijn)
Username varchar
Password varchar
IsActive boolean

Nu heeft VS 2003 de XSD naar C# code geconverteerd en heb ik een eigen dataset (dsUsers) waarmee ik kan werken. Het maakt statements mogelijk zoals:

dsUsers.Users.AddUsersRow(null, "Frans", "de", null, "johny", "something", true);

Helaas geeft de compiler hier een error. Het UserDataSet Object heeft een methode AddUsersRow die als eerste argument het GroupID verwacht in de vorm van een integer. Helaas mag een integer niet de waarde NULL hebben. Bij een string zoals achternaam is het geen probleem. Maar met een int pikt hij dat niet.

Daarnaast kan ik niet de waarde 0 gebruiken ipv van null, omdat SQL dan gaat tegenspurtellen, die denkt dan tenslotte dat er een Group met ID 0 bestaat (FK relatie).

Heeft iemand een mooie oplossing?
De UserDataSet wordt gegerereerd dus daar wil ik niet echt aan de code zitten.

Any sufficiently advanced technology is equivalent to magic.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

En als je er System.DbNull.Value van maakt?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Kan je geen -1 oid meegeven?

Anders kan je toch even prutsen in die gegenereerde code. Als dat ID veld een autonummer veld is, dan is het nl. de bedoeling dat de DB daar een nummer aan assigned.
Je zou dus je signature van die method kunnen aanpassen, zodanig dat het ID veld niet meer kan meegegeven worden met die method, en dat het ID veld ook op DataTable niveau als PrimaryKey en AutoIncrement ingesteld staat.

https://fgheysels.github.io/


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Als ik DBNull.Value gebruik dan krijg ik de melding dat hij:
DBNull.Value niet kan converten naar een int

De waarde -1 probeert hij gewoon in de database te stoppen, dus dan krijg ik de FK error weer.

De gegenereerde CS klasse wil ik liever niet aanpassen, want ik wil in het geval van een DB wijziging wil ik die opnieuw genereren en dan ben ik mijn wijzigingen weer kwijt.

Any sufficiently advanced technology is equivalent to magic.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Als je een foreign key constraint error krijgt, dan zal die ID niet het ID zijn van de USER, maar het ID van de groep waartoe hij behoort vermoed ik.
Het UserId is nl. een Primary Key.

Ik ging dus in 't begin van iets verkeerds uit. 8)7

Als in je DB het groupId op 'not null' gedefinieerd staat, dan kan je zowiezo geen user maken zonder dat ie tot een bepaalde groep behoort.
Ik vraag me trouwens af of je dat wilt, dat een user niet tot een groep kan behoren.

Als je dat toch mogelijk wilt maken, dan zal je toch in die gegenereerde code eea moeten aanpassen.
Je kunt daar dan nl. code schrijven waarmee je ervoor zorgt dat, als dat groupid een speciale waarde heeft (laat ons zeggen -1), dat er dan een NULL in de DB wordt gestopt voor dat veld:

code:
1
2
3
4
5
6
7
8
if( groupId == -1 )
{
     aInsertCommand.Parameters [@p_groupId"].Value = DBNull.Value;
}
else
{
     aInsertCommand.Parameters [@p_groupId"].Value = groupId;
}

[ Voor 68% gewijzigd door whoami op 10-03-2004 11:26 ]

https://fgheysels.github.io/


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

In VB.NET (dus ook in C#) krijg je bij de dataset nog andere subs e.d. waaronder:

Is<kolomnaam>Null en Set<Kolomnaam>Null

Ik doe meestal het volgende:

Dim Tdr As dataset.CustomTableRow= dataset.CustomTable.NewCustomTableRow
Tdr.kolomnaam = waarde
of
Tdr.SetkolomnaamNull()

Als Tdr helemaal gevuld is doe je:
dataset.CustomTableRow.AddCustomTableRow(Tdr)

Zo heb je ook iets meer controle over wat je invult. Hetzelfde geldt trouwens ook als je een waarde in bv. een textbox zet. Als die waarde System.DBNull is, krijg je een error. Als je voor het vullen dit ff checked (door datarow.IskolomnaamNull), heb je geen problemen..

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Helaas verlies je op deze manieren de datatype-afdwinging.
Ik denk dat ik het volgende maar moet doen:

In het XSD schema verander ik GroupID van datatype int naar string.
Dan maakt hij er een string van in de verwachte parameters van de methode.
Dan kan ik well null gebruiken.

Any sufficiently advanced technology is equivalent to magic.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Dat is ranzig.

En hoe worden die gegevens dan naar je DB gestuurd? In je DB is het nl. numeriek, en je stuurt een string door.
Wat als je dan een niet numerieke waarde meegeeft? Hoe zit het dan met je datatype afdwinging?

Trouwens, ik vraag me af waar je volgens jou de 'datatype afdwinging' verliest in de oplossing hierboven ?
Je typed dataset heeft toch een method die een row teruggeeft voor die 'typed' dataset?

[ Voor 31% gewijzigd door whoami op 10-03-2004 11:50 ]

https://fgheysels.github.io/


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Hmm... dat begint op dBase te lijken. Dacht we dat stadium wel gepasseerd waren.

Ik snap niet wat je bedoelt met het verliezen van datatype-afdwinging.
De twee functies die je bij de strongtyped datasets per kolom krijgt, zijn gewoon om te controleren of het veld Null is en om een veld Null te maken. Als je dat niet wilt, omdat je een waarde wilt invoeren, dan gebruik je customdatarow.kolomnaam=... om de waarde toe te voegen.

Dit is dus gewoon strongtyped..

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Vind het wel vreemd dat er met niet verplichte velden niet goed rekening gehouden is. Het grote probleem is gewoon dat integer geen klasse is zoals String, maar een vast datatype.

Any sufficiently advanced technology is equivalent to magic.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
integer is een primief (value-type), en wordt geboxed naar Int32 die een class (reference type) is.

Een value type wordt op de stack gecreeërd en moet altijd een waarde hebben. Een value type (bv int, string, structs, ....) kan dus geen null bevatten.

https://fgheysels.github.io/


  • Zyphrax
  • Registratie: September 2001
  • Laatst online: 04-04-2023
Thnx 4 the hulp iig.

Ik ga denk ik voor de CustomRow.Column = .... manier

Any sufficiently advanced technology is equivalent to magic.

Pagina: 1