[ASP.NET/ADO] Update Command

Pagina: 1
Acties:

  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
PROBLEEMSTELLING:

Een Access database, één tabel met één primaire sleutel.
ASP.NET website vraagt uit de database gegevens op en zet deze in een DataGrid. Deze heeft mogelijkheid tot EDIT en UPDATE.
Na commando edit gaat deze over tot E.Item.Itemindex (edit item index) en kunnen hier nieuwe waarden voor een rij worden ingevuld, alle waarden behalve de primaire sleutel welke onveranderbaar is.

De update functie kijkt en vergelijkt welk veld in de op het scherm getoonde tabel de ID heeft, vergelijkt deze met de ID in de tabel van de database en update in die rij de waarden. De ID is een Autonummer veld.

Welnu... ik zeg update en de pagina stuurt de waarden in de textboxes naar de update functie:
'Qupdate(ID,Software,Kluis,Kast,Extra,Ltotaal,Lgebruik,Lspec,Ontbreekt)'

De update functie (even zonder verdere benaming en specs van de params):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Code:
Function Qupdate(ByVal id As Integer, ByVal software As String, ByVal inkluis As Boolean, ByVal inkast As Boolean, ByVal extrainfo As String, ByVal totaallicenties As String, ByVal ingebruiklicenties As String, ByVal specificatielicenties As String, ByVal ontbreekt As Boolean) As Integer 
   Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\Inetpub\wwwr"& _ 
"oot\softwarekast.mdb" 
   Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString) 
 
   Dim queryString As String = "UPDATE [software] SET [Software]=@Software, [inkluis]=@inkluis, [inkast]=@inkast,"& _ 
" [extrainfo]=@extrainfo, [totaallicenties]=@totaallicenties, [ingebruiklicenties"& _"]=@ingebruiklicenties, [specificatielicenties]=@specificatielicenties, [ontbreek"& _"t]=@ontbreekt WHERE ([software].[Id] = @Id)" 
   Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand 
   dbCommand.CommandText = queryString 
   dbCommand.Connection = dbConnection 
  Dim rowsAffected As Integer = 0 
   dbConnection.Open 
   Try 
  rowsAffected = dbCommand.ExecuteNonQuery 
   Finally 
  dbConnection.Close 
   End Try 
 
   Return rowsAffected 
    End Function



En dan... de rowsAffected return 0!!! Waarom?
De oude waarden blijven staan en de update is mislukt.

Heb geprobeerd behalve de waarden op ID te vergelijken met de tabel het ook een geprobeerd met het veld 'Software' (wordt wel vervelend bij dubbele waarden). Dan werkt het wel, de update geschiedde. Alleen het kolommetje (veld eigenlijk, want er is slechts 1 row) software zelf update niet. hmm....


In ieder geval...
Wie kan mij zeggen waarom mijn update functie niet functioneert?


Bas Zwaan
ICTRO
Vestiging Utrecht

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Kortom: ASP.Net wil wel zeggen wat er fout is, maar je negeert de foutmelding ... :P

Visual Basic .NET:
1
2
3
4
5
   Try 
  rowsAffected = dbCommand.ExecuteNonQuery 
   Finally 
  dbConnection.Close 
   End Try 


Sowieso mis ik het toevoegen van de waarden dmv parameters. En MS-Access (Ik geloof OleDB in het algemeen) ondersteunt niet deze vorm van parameters toepassen; daar moet je een ? ipv @naam gebruiken. (als ik me goed herinner)

Daarnaast zal ik maar niets zeggen over bepaalde ranzigheden en inflexibiliteiten van je code (bijvoorbeeld het hard coderen van je connectionstring op deze manier); kijk anders eens wat quickstarts door op www.asp.net

[ Voor 93% gewijzigd door gorgi_19 op 09-12-2003 12:14 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Die had ik er om de pagina te sparen uitgelaten, dit zijn de params:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
     Dim dbParam_id As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_id.ParameterName = "@Id"
        dbParam_id.Value = id
        dbParam_id.DbType = System.Data.DbType.Int32
        dbCommand.Parameters.Add(dbParam_id)
        Dim dbParam_software As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_software.ParameterName = "@Software"
        dbParam_software.Value = software
        dbParam_software.DbType = System.Data.DbType.String
        dbCommand.Parameters.Add(dbParam_software)
        Dim dbParam_inkluis As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_inkluis.ParameterName = "@inkluis"
        dbParam_inkluis.Value = inkluis
        dbParam_inkluis.DbType = System.Data.DbType.Boolean
        dbCommand.Parameters.Add(dbParam_inkluis)
        Dim dbParam_inkast As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_inkast.ParameterName = "@inkast"
        dbParam_inkast.Value = inkast
        dbParam_inkast.DbType = System.Data.DbType.Boolean
        dbCommand.Parameters.Add(dbParam_inkast)
        Dim dbParam_extrainfo As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_extrainfo.ParameterName = "@extrainfo"
        dbParam_extrainfo.Value = extrainfo
        dbParam_extrainfo.DbType = System.Data.DbType.String
        dbCommand.Parameters.Add(dbParam_extrainfo)
        Dim dbParam_totaallicenties As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_totaallicenties.ParameterName = "@totaallicenties"
        dbParam_totaallicenties.Value = totaallicenties
        dbParam_totaallicenties.DbType = System.Data.DbType.String
        dbCommand.Parameters.Add(dbParam_totaallicenties)
        Dim dbParam_ingebruiklicenties As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_ingebruiklicenties.ParameterName = "@ingebruiklicenties"
        dbParam_ingebruiklicenties.Value = ingebruiklicenties
        dbParam_ingebruiklicenties.DbType = System.Data.DbType.String
        dbCommand.Parameters.Add(dbParam_ingebruiklicenties)
        Dim dbParam_specificatielicenties As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_specificatielicenties.ParameterName = "@specificatielicenties"
        dbParam_specificatielicenties.Value = specificatielicenties
        dbParam_specificatielicenties.DbType = System.Data.DbType.String
        dbCommand.Parameters.Add(dbParam_specificatielicenties)
        Dim dbParam_ontbreekt As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
        dbParam_ontbreekt.ParameterName = "@ontbreekt"
        dbParam_ontbreekt.Value = ontbreekt
        dbParam_ontbreekt.DbType = System.Data.DbType.Boolean
        dbCommand.Parameters.Add(dbParam_ontbreekt)

  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Ik beken de ranzigheid van mijn code... ik zet nu de chaos op poten, dan volgt er de schoonmaakploeg.

Ik blijf oefenen. Maar verder nog ideeen?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Ja, wat ik in het begin zei.. Sloop die try-finally constructie er uit; dan krijg je tenminste een foutmelding.

[ Voor 22% gewijzigd door gorgi_19 op 09-12-2003 12:15 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Try-finally constructie eruit gesloopt. Resultaat is nog hetzelfde. Lijkt er niet op dat ASP.NET een fout oppikt ergens, maar denkt dat de update goed verloopt. Toch vindt deze niet echt plaats.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
gorgi_19 schreef op 09 december 2003 @ 12:05:
En MS-Access (Ik geloof OleDB in het algemeen) ondersteunt niet deze vorm van parameters toepassen; daar moet je een ? ipv @naam gebruiken. (als ik me goed herinner)
Nee hoor.
Je kan met de OleDb drivers en Access perfect de @naam parameter notatie gebruiken.
Je moet echter wel oppassen dat je je parameters in de juiste volgorde aan je parameter collectie toevoegt en een waarde geeft. (De juiste volgorde == de parameter die je als eerste in je query gezet hebt, moet je ook als eerste toevoegen, etc...)

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
gorgi_19 schreef op 09 december 2003 @ 12:14:
Ja, wat ik in het begin zei.. Sloop die try-finally constructie er uit; dan krijg je tenminste een foutmelding.
Niet toch?
Die try/finally gaat toch geen exceptie catchen en deze onderdrukken?
Als je nu dit doet:
code:
1
2
3
4
5
6
7
8
try
{
   // code die exceptie gooit
}
catch
{
   // geen afhandelingscode in catch blok
}

Dan ga je de exceptie wel gaan onderdrukken.

@topicstarter:
Doe je die update in een transactie, en vergeet je die transactie te committen?
Ben je wel zeker dat je een bestaande waarde (pk) meegeeft als parameter voor de PK ?

[ Voor 17% gewijzigd door whoami op 09-12-2003 12:21 ]

https://fgheysels.github.io/


  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Hmm... volgens mij onderdrukt deze inderdaad niet direct de exceptie. Maar er vindt dus volgens mij ook geen exceptie plaats.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 09 december 2003 @ 12:17:
[...]

Nee hoor.
Je kan met de OleDb drivers en Access perfect de @naam parameter notatie gebruiken.
Je moet echter wel oppassen dat je je parameters in de juiste volgorde aan je parameter collectie toevoegt en een waarde geeft. (De juiste volgorde == de parameter die je als eerste in je query gezet hebt, moet je ook als eerste toevoegen, etc...)
Als het die volgorde is, kan het best zijn dat daar de oorzaak in ligt.. :P Aangezien ID in z'n parameters vooraan staat, en in je query achteraan? Of begrijp ik je nu verkeerd?

* gorgi_19 is ook wel benieuwd hoe hij er dan bij komt dat er alleen maar ? gebruikt kunnen worden; gaat ff zoeken...

edit:

Hmmm.. Apart.. ASPNetforums maakt op deze wijze ook gebruik van parametrized queries.. :P

[ Voor 8% gewijzigd door gorgi_19 op 09-12-2003 12:29 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
ElTigre schreef op 09 december 2003 @ 12:22:
Hmm... volgens mij onderdrukt deze inderdaad niet direct de exceptie. Maar er vindt dus volgens mij ook geen exceptie plaats.
Dat zeg ik. Anders zou je er wel een voor je neus krijgen.
Debug je code eens, en zet eens watches op de variabelen die je aan je parameters doorgeeft, en kijk of deze wel goed zijn.
Het kan goed zijn dat je bv. een id -1 oid meegeeft aan de parameter ID, en dat er geen record bestaat met id -1.

https://fgheysels.github.io/


  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
ID staat alleen achteraan vanwege de WHERE clause, dat maakt verder niet uit voor de volgorde waarop de info erin gaat lijkt mij. Volgorde maakt verder alleen uit bij de params die je gebruikt om velden te updaten. Die heb ik wel op volgorde gechecked.

  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Heb verder inderdaad een watch gezet op de ID parameter maar deze geeft wel de juiste mee, die van het betreffende record. Ook heb ik eerder al de waarden van de andere parameters gechecked maar ze kloppen wel.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Die volgorde is wel belangrijk, aangezien OleDb geen onderscheid maakt met die namen. Je kan de parameternotatie gebruiken zoals jij die nu gebruikt (@naam dus), maar intern gaat OleDb daar wel een ? van maken.
Ik zie dat je eerste parameter die je toevoegt dus die ID is, terwijl die parameter als laatste in je query staat. Voeg die ID parameter dus ook eens als laatste toe aan je ParameterCollection.

https://fgheysels.github.io/


  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Is er nog een mogelijkheid dat ASP.NET problemen heeft met het updaten van records in een Access database met een autonummering veld als primary key? Gezien het feit dat je dat veld sowieso niet kan updaten zou 't misschien de rest ook niet toelaten? Of praat ik nu koeterwaals?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Dan zou hij normaliter, als het niet mag, een exception opgooien.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ElTigre
  • Registratie: Juni 2003
  • Laatst online: 16-02-2024
Ok ik praat koeterwaals!

De oplossing, dank aan jullie, ligt hier inderdaad in de volgorde. De params waren allemaal in de juiste volgorde behalve de ID parameter welke alleen in de WHERE clause wordt gebruikt. Het verplaatsen van deze naar achteren lost inderdaad het probleem helemaal op!

Ik had niet ingezien dat ook bij deze parameter de locatie van groots belang is.

Dank u.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

@whoami

Maar, samengevat zou je dus zeggen dat je het volgende SQL statement:
SQL:
1
Update tabelnaam Set kolom1 = @NieuweWaarde + 1 Where kolom1 = @NieuweWaarde

Je bij SQL Server 1 parameter moet toevoegen, en bij MS Access er 2?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
gorgi_19 schreef op 09 december 2003 @ 12:38:

Maar, samengevat zou je dus zeggen dat je het volgende SQL statement:
SQL:
1
Update tabelnaam Set kolom1 = @NieuweWaarde + 1 Where kolom1 = @NieuweWaarde

Je bij SQL Server 1 parameter moet toevoegen, en bij MS Access er 2?
Hmmm, dat zou idd logisch zijn. Echter, ik denk niet dat je 2 parameters met dezelfde naam kunt hebben.
Ik denk dat je dus zowel bij Sql Server als bij Access dat met 2 parameters zult moeten doen.
Misschien ff uittesten?

[ Voor 12% gewijzigd door whoami op 09-12-2003 13:11 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 09 december 2003 @ 13:07:
[...]


Hmmm, dat zou idd logisch zijn. Echter, ik denk niet dat je 2 parameters met dezelfde naam kunt hebben.
Ik denk dat je dus zowel bij Sql Server als bij Access dat met 2 parameters zult moeten doen.
Misschien ff uittesten?
Het was een vrij 'theoretische' gedachtengang; van SQL Server weet ik zeker dat deze met 1 parameter werkt of kan werken.

Alleen als volgorde belangrijk is, maakt het in principe dus compleet niet uit hoe je je parameter noemt (zie ook het probleem van de TS). Hij vervangt blijkbaar al in het begin de @naam voor een ?.

Wel vaag dat MS Access dan uberhaupt @naam accepteert; misschien alleen vanwege 'compatibiliteit' met de SQL Server syntax?

* gorgi_19 gaat eerdaags eens testen..

* gorgi_19 weet weer waar hij het gezien heeft.. klik

En dan vooral de responses van het asp.net team members.

[ Voor 12% gewijzigd door gorgi_19 op 09-12-2003 16:15 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1