Toon posts:

[VB - SQL]

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste medeprogrammeurs....

Ik probeer een aantal gegevens via ADO vanuit m'n VB programma toe te voegen aan een MSDE database met behulp van een "stored procedure".

Het gaat om NAW gegevens. Wanneer een cliënt wordt toegevoegd aan de database is het niet altijd zeker op welke afdeling hij/zij terecht komt dus hoeft men niet persé een afdeling te kiezen. Hierop loopt alles fout. De opgeslagen procedure krijgt een x-aantal parameters te verwerken echter wanneer de procedure bij "ID_afdeling" beland gaat het mis. Hij ontvangt daar een lege string --> eigenlijk een lege Integer. De waarde is "" dus de procedure denkt dat hij een string te verwerken krijgt. Hierdoor wordt alles geblokkeerd en ik kom maar niet verder.

Wanneer ik van de betreffende parameter een varchar maak ipv een Integer gaat het goed echter hij vult nu een 0 in. Dit is NIET de bedoeling. Zodra er geen afdeling gekozen is mag er ook GEEN waarde in de database ingevuld worden.
Daar het veld in de database gelinkt is aan andere tabellen is een 0 FOUT omdat een 0 niet voorkomt in zijn CONSTRAINT.

Hieronder wat code:


IN DE DATABASE::

ALTER PROCEDURE dbo.insertClientSP

/*

*/

-- parameters

(
@Zoeknaam varChar(50) = Null,
@Geslacht bit,
@Voorvoegsels varchar(10) = Null,
@Achternaam varchar(50) = Null,
@Voorletters varchar(10) = Null,
@Voornamen varchar(50) = Null,
@Roepnaam varchar(40) = Null,
@Adres varchar(50) = Null,
@Postcode varchar(7) = Null,
@Woonplaats varchar(50) = Null,
@Telefoon varchar(11) = Null,
@ID_afdeling varchar(50) = Null,
@Kamer varchar(7) = Null,
@Geboortedatum datetime = Null
)

-- query

AS

SET NOCOUNT ON

DECLARE @ID_afdeling_int int

If @ID_afdeling = Null
SET @ID_afdeling_int = CONVERT(int, @ID_afdeling)


INSERT INTO dbo.tblClienten

(Zoeknaam, Geslacht, Voorvoegsels, Achternaam, Voorletters, Voornamen, Roepnaam,
Adres, Postcode, Woonplaats, Telefoon, ID_afdeling, Kamer, Geboortedatum, PrintDatum)

VALUES (@Zoeknaam, @Geslacht, @Voorvoegsels, @Achternaam, @Voorletters, @Voornamen, @Roepnaam,
@Adres, @Postcode, @Woonplaats, @Telefoon, @ID_afdeling_int, @Kamer, @Geboortedatum, getDate())


RETURN


IN VB::

Public Sub saveNewClient()

Dim objParam As ADODB.Parameter
Dim objSPRs As ADODB.Recordset
Dim objSPComm As ADODB.Command
Set objSPComm = New ADODB.Command
With objSPComm
.ActiveConnection = gobjConn
.CommandType = adCmdStoredProc
.CommandText = "insertClientSP"
End With
'Zoeknaam
Set objParam = objSPComm.CreateParameter("Zoeknaam", adVarChar, adParamInput, 50, Me.txtZoeknaam.Text)
objSPComm.Parameters.Append objParam

'geslacht
Set objParam = objSPComm.CreateParameter("Geslacht", adBoolean, adParamInput, 10, Me.optSex(0).Value)
objSPComm.Parameters.Append objParam

'voorvoegsels
Set objParam = objSPComm.CreateParameter("Voorvoegsels", adVarChar, adParamInput, 10, Me.txtVoorvoegsels.Text)
objSPComm.Parameters.Append objParam

'achternaam
Set objParam = objSPComm.CreateParameter("Achternaam", adVarChar, adParamInput, 200, Me.txtAchternaam.Text)
objSPComm.Parameters.Append objParam

'voorletters
Set objParam = objSPComm.CreateParameter("Voorletters", adVarChar, adParamInput, 50, Me.txtVoorletters.Text)
objSPComm.Parameters.Append objParam

'voornamen
Set objParam = objSPComm.CreateParameter("Voornamen", adVarChar, adParamInput, 150, Me.txtVoornamen.Text)
objSPComm.Parameters.Append objParam

'Roepnaam
Set objParam = objSPComm.CreateParameter("Roepnaam", adVarChar, adParamInput, 100, Me.txtRoepnaam.Text)
objSPComm.Parameters.Append objParam

'Adres
Set objParam = objSPComm.CreateParameter("Adres", adVarChar, adParamInput, 100, Me.txtAdres.Text)
objSPComm.Parameters.Append objParam

'Postcode
Set objParam = objSPComm.CreateParameter("Postcode", adVarChar, adParamInput, 7, Me.txtPostcode.Text)
objSPComm.Parameters.Append objParam

'Woonplaats
Set objParam = objSPComm.CreateParameter("Woonplaats", adVarChar, adParamInput, 100, Me.txtWoonplaats.Text)
objSPComm.Parameters.Append objParam

'Telefoon
Set objParam = objSPComm.CreateParameter("Telefoon", adVarChar, adParamInput, 11, Me.txtTelefoon.Text)
objSPComm.Parameters.Append objParam

'afdeling_ID
'LET OP : hier halen we de TAG op van de gekozen afdeling!!!!!!!
Set objParam = objSPComm.CreateParameter("ID_afdeling", adVarChar, adParamInput, 50, Me.txtAfdeling.Tag)
objSPComm.Parameters.Append objParam

'kamernummer
Set objParam = objSPComm.CreateParameter("Kamer", adVarChar, adParamInput, 10, Me.txtKamernummer.Text)
objSPComm.Parameters.Append objParam

'geboortedatum
Set objParam = objSPComm.CreateParameter("Geboortedatum", adDate, adParamInput, , Me.DatePicker1.Value)
objSPComm.Parameters.Append objParam

Set objSPRs = objSPComm.Execute(, objParam)

Set objSPRs = Nothing
Set objSPComm = Nothing

Unload Me
Set frmAddClient = Nothing
End Sub


Bovenstaande code is ook uitgevoerd met een Array echter gaf hetzelfde resultaat.....

Weet iemand de/een oplossing?? _/-\o_

Bedankt,

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:08

gorgi_19

Kruimeltjes zijn weer op :9

Mag je uberhaupt Null values toevoegen in je database?

Verder is "" niet gelijk aan Nothing / Null.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Zeker mag je NULL values toe voegen aan je database. Geen probleem, als je maar Null waarden "accepteerd". Dat moet je natuurlijk wel aangeven wanneer je de tabel ontwikkeld. ;)

Verder is NULL dus niet hetzelfde als "" (EDIT::: sorry, verkeerd gelezen...dat zei je dus al 8) )

Daar het hier gaat om een Integer wordt, als je "" als parameter-argument doorgeeft, dit volgens mij gezien als een string waarde en krijg ik dan ook de fout dat ik de CONVERT functie moet gebruiken.
Als ik dat dan doe --> Doordat ik als eerste de parameter @ID_afdeling declareer als varchar(50) en later deze weer terugzet naar een INT, rammelt hij een 0 in de database ipv NIX

If @ID_afdeling = Null
SET @ID_afdeling_int = CONVERT(int, @ID_afdeling)


8)7

[ Voor 8% gewijzigd door Verwijderd op 04-01-2004 20:44 ]


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 15:56
misschien niet zo netjes:

Maar als je nou:
Visual Basic:
1
2
3
4
if Me.txtAfdeling.Tag = "" 
  then
  Me.txtAfdeling.Tag = 0
end if


En dan gebruik je het id 0 die dus voorsteld dat er geen afdeling aan gekoppeld is.
Of je maakt de keuzelijst verplicht en zet je er een optie "Geen Afdeling" tussen.

Maar het zou ongetwijfeld ook anders kunnen.

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Remco,

Klopt wat je zegt maar het is een parameter waarde die ik in de opgeslagen procedure al op 0 heb gezet --> @ID_afdeling int = 0

Dat houd in dat er, zodra er niet voor een afdeling is gekozen, er een 0 ingevoerd wordt.

Welnu, alles in de MSDE database is aan elkaar gerelateerd (zoals een goede database betaamd ;) ). Om te testen heb ik alle relaties losgekoppeld, alle afdelingen verwijdert, relaties weer gekoppeld en een INSERT geprobeerd.

DIE '0' WERKT DUS NIET omdat er in de afdelingen tabel nog niets staat. Heel logisch natuurlijk maarjah, ik accepteer wel 'lege' waarden in de integer kolom......

Ik ben echt ff de draad kwijt in deze.....sorry...... :?

Bedankt voor je reply in ieder geval....wordt enorm gewaardeerd _/-\o_

Gr. RIchard

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je hebt -als ik het goed begrijp- een foreign key van AfdelingId in de tabel werknemer naar AfdelingId in de tabel afdelingen?

Logisch dat de insert dan niet lukt. Je moet of 'enfore relationship' niet gebruiken of een afdeling 0 'onbekend' toevoegen aan de tabel afdeling.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
Klopt......helemaal gelijk in.............ik heb zojuist de "Relatie afdwingen voor INSERT en UPDATE" uitgeschakeld en nu werkt het perfect.......

Fjiew zeg, dat ik daar niet eerder opgekomen ben......bedankt voor de GOUDEN TIP! _/-\o_

Maar dan nog, waarom dan die relatie afdwingen......dat werkt dus niet als je een compleet lege database aan je applicatie toevoegd voordat je hem uitlevert.....of je moet een SP laten uitvoeren die in bepaalde tabellen een "dummy" invoert zodat het blijft werken :/ --> is ook 1 van mijn gedachten om te doen....relaties afdwingen is best prettig vind ik....

Verwijderd

Weet je zeker dat je database nu referentieel nog correct is, maw bevatten de afdeling_ids NULLS?
Het probleem met VB is dat het VB-type STRING geen NULL waardes kan bevatten. Een lege string is een lege string en geen null. Je zult hier dus iets dergelijks om heen moeten zetten:
code:
1
2
3
4
5
if textbox.text = "" then
  param.value = Null
else
  param.value = textbox.text
end if


of je foreign keys nog kloppen kun je in SQL Server controleren met

code:
1
DBCC CHECKCONSTRAINTS

Verwijderd

Topicstarter
TheChkU,

THXS...
Ik heb gewoon alle afdelingen weggehaald na de relaties verwijdert te hebben echter ook alle afdelingID's bij de tblClienten....dus dat klopt allemaal weer (voor zover ik kan beoordelen). Daarna de relaties opnieuw gelegd en nix aan de hand dus volgens mij klopt alles weer. Het is een programma in ontwikkeling (bijna af) maar de manier van programmeren is voor mij nieuw. Voorheen altijd ADO gebruikt met Access. Veel losgekoppelde recordsets enzow maar ik vond dat nogal traag reageren. Dit is een multi-user prog. dus is het werken met MSDE veel betrouwbaarder. Bijkomend voordeel is dat er met Stored Procedures gewerkt kan worden wat de programmering en helemaal de snelheid ten goede komt! ;) Graag je advice/comments op dit... ;)
Pagina: 1