[ASP.NET] Probleempje met wegschrijven data in SQL

Pagina: 1
Acties:

  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
De volgende situatie doet zich voor:

We hebben een webform die data moet wegschrijven naar een SQL 2000 server.
Alles lijkt goed te gaan en we krijgen ook geen Error, maar als je vervolgens in de tabel gaat kijken via de SQL enterprise manager zie je niets...

de private sub uit de codebehind:
Ik weet dat hier meer strings gedeclareerd worden als dat er worden weggeschreven.

Visual Basic:
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
Private Sub SubmitStap1_ServerClick(ByVal aantal1 As String, ByVal soort1 As String, ByVal groep1 As String, ByVal omschrijving1 As String, ByVal gewicht1 As String, ByVal l1 As String, ByVal b1 As String, ByVal h1 As String, ByVal aantal2 As String, ByVal soort2 As String, ByVal groep2 As String, ByVal omschrijving2 As String, ByVal gewicht2 As String, ByVal l2 As String, ByVal b2 As String, ByVal h2 As String, ByVal aantal3 As String, ByVal soort3 As String, ByVal groep3 As String, ByVal omschrijving3 As String, ByVal gewicht3 As String, ByVal l3 As String, ByVal b3 As String, ByVal h3 As String)
        If Page.IsValid = True Then

            Dim txtdatum As String = DateTime.Now
            Dim txtmillisec As String = DateTime.Now.Millisecond
            Dim txtdatumtijd As String = txtdatum + txtmillisec
            Dim txtgebruikersnaam As String = Context.User.Identity.Name
            Dim txtuserip As String = HttpContext.Current.Request.UserHostAddress

            ' Haal ConnectionString uit web.config <appsettings> en stop deze in SqlConn String
            Dim SqlConn As SqlConnection = New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))

            ' Maak SQL Commando object en stop deze in SqlCmd string
            Dim SqlCmd As New SqlCommand("sp_AddStap1test", SqlConn)

            ' Geef aan wat voor SQL Commando je wilt uitvoeren
            ' In dit geval een Stored Procedure
            SqlCmd.CommandType = CommandType.StoredProcedure

            ' Koppel de velden van het formulier aan de sql velden
            SqlCmd.Parameters.Add(New SqlParameter("@gebruikersnaam", SqlDbType.VarChar, 50))
            SqlCmd.Parameters("@txtgebruikersnaam").Value = txtgebruikersnaam

            SqlCmd.Parameters.Add(New SqlParameter("@datumtijd", SqlDbType.VarChar, 50))
            SqlCmd.Parameters("@txtdatumtijd").Value = txtdatumtijd

            SqlCmd.Parameters.Add(New SqlParameter("@txtuserip", SqlDbType.VarChar, 15))
            SqlCmd.Parameters("@txtuserip").Value = txtuserip

            SqlCmd.Connection.Open()

            Try
                SqlCmd.ExecuteNonQuery()


            Catch ex As Exception
                SQLERROR.Text = "Fout met schrijven naar de database"
            End Try

        End If
    End Sub


de Stored procedure uit de sql server:
de veldnamen in de tabel zijn: gebruikersnaam, datum_tijd, user_ip
er zijn meer velden maar deze 3 moeten in eerste instantie gewoon weggeschreven worden.
code:
1
2
3
4
5
6
CREATE procedure dbo.sp_AddStap1test
@txtgebruikersnaam varchar, @txtdatumtijd varchar, @txtuserip varchar
as
insert into tbl_orderaanmaak (gebruikersnaam, datum_tijd, user_ip)
values (@txtgebruikersnaam, @txtdatumtijd, @txtuserip)
GO


wat doen wij fout ?

[ Voor 3% gewijzigd door Plopeye op 29-11-2005 10:24 ]

Unix is user friendly, it's only selective about his friends.....


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je moet de parameters in je stored proc een lengte meegeven.

CREATE procedure dbo.sp_AddStap1test
@txtgebruikersnaam varchar(50)

Daarnaast moet je eigenlijk niet je stored procs prefixen met sp_, dat is nl. de standaard prefix voor system stored procs en SQL Server kijkt voor sp's met deze prefix eerst in de master database in plaats van de huidige database.

Ten laatste: je moet geen datumtijd in een varchar stoppen, je hoort daar eigenlijk gewoon (small)datetime te gebruiken. Het lijkt misschien in eerste instantie de eenvoudigste oplossing, maar je krijgt geheid problemen in de toekomst.

[ Voor 25% gewijzigd door P_de_B op 29-11-2005 10:29 ]

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


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
De aangedragen oplossing werkt inderdaad...

Wat betreft de datumtijd die ik in een varchar stop... dit is een samengestelde string van
datetime.now.tostring en datetime.now.millisecond.tostring
en word alleen gebruikt om er zeker van te zijn dat er bij het terugvragen van mij orderaanmaakid dat ik de juiste id terugkrijg verder word hij niet weer gebruikt...

via deze methode lijkt het mij nagenoeg onmogelijk dat er 2 gebruikers dezelfde unieke waarde hebben aangezien hij ook de millisecondes meeneemt...

nu we het toch over tijd hebben:

Waar en hoe kan ik de currentculture instellen zodat ik de datum en tijd op de europese manier krijg uit datetime.now dus datum in dd/mm/jjjj formaat ipv mm/dd/jjjj
en de tijd in HH:mm:ss ipv hh:mm:ss AM|PM

[ Voor 20% gewijzigd door Plopeye op 30-11-2005 08:56 ]

Unix is user friendly, it's only selective about his friends.....


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
Hoe vraag jij dat id dan terug op ?
Is je pk-veld een identity ?

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dat terugvragen van een orderID kun je beter op een andere manier doen als het tenminste een 'autonummer' id is.

Zoek maar eens op de @@IDENTITY functie in BooksOnline, of op SCOPE_IDENTITY() als je triggers in de database gebruikt.

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


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
het terugvragen van de orderid gaat als volgt:

in de stored procedure staat deze code om de id terug te vragen:

Set @orderaanmaakid = (SELECT orderaanmaak_id AS orderaanmaakid from tbl_orderaanmaak
where datum_tijd = @txtdatumtijd
Return @ orderaanmaakid

Dit natuurlijk met een iets uitgebreide code van de code die in de TS staat.
En ja oderaanmaak_id is een autoincrement

[ Voor 6% gewijzigd door Plopeye op 30-11-2005 09:17 ]

Unix is user friendly, it's only selective about his friends.....


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
Dan haal je je id beter op mbhv @@identity of scope_identity, ipv de 'hack' die je nu uitvoert.

De @@identity variable en scope_identity() functie is speciaal voorzien voor het ophalen van het id van het laatst geinserte record. Check even de books online voor de verschillen tussen @@identity en scope_identity. Het is een heel subtiel verschil, en kies dan de voor jou beste optie. 't Is in ieder geval beter dan de truuk die je nu uitvoert.

https://fgheysels.github.io/


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
Ik ben er door een .Net goeroe op gewezen dat het gevaarlijk is om de laatst geinjecteerde record op te vragen zeker als het een druk bezochte site is...

nu ga je een waarde creeren die tot op de duizendste seconde uniek is... en ik log het ip ook nog dus ik zou in principe aan de hand van een duizendste seconde en ip de juiste waarde op kunnen halen... met andere woorden hoe groot is de kans dat er 2 gebruikers vanaf 1 ip op de duizendste seconde nauwkeurig tegelijk op submit drukken....

Unix is user friendly, it's only selective about his friends.....


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Wil je die zogenaamde dot net goeroe nooit weer geloven, hij praat nl. onzin. Als je @@IDENTITY gebruikt krijg je (behoudens triggers) _altijd_ de correcte ID. @@IDENTITY is gelimiteerd tot je eigen scope.

@@IDENTITY is echt de defacto manier om dit te doen.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
En met scope_identity krijg je gegarandeerd de laatst geinserte (autonumber generated) id die binnen jouw sessie gegenereerd werd voor de tabel die je specifieert.

En een .NET goeroe kan misschien wel een goeroe zijn in .NET, maar SQL Server is toch weer iets anders.

[ Voor 27% gewijzigd door whoami op 30-11-2005 09:58 ]

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22-04 19:43
Plopeye schreef op woensdag 30 november 2005 @ 09:38:
Ik ben er door een .Net goeroe op gewezen dat het gevaarlijk is om de laatst geinjecteerde record op te vragen zeker als het een druk bezochte site is...
Jouw .Net goeroe doelt waarschijnlijk op de manier waarop dit met MAX(id) gedaan wordt (en dan heeft ie gelijk), maar heeft waarschijnlijk nog nooit van @@IDENTITY gehoord...

Roomba E5 te koop


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
Ok ik ga hier eens naar zoeken zou een stuk makkelijker kunnen zijn ja...

iets eerder heb ik ook geschreven:

nu we het toch over tijd hebben:

Waar en hoe kan ik de currentculture instellen zodat ik de datum en tijd op de europese manier krijg uit datetime.now dus datum in dd/mm/jjjj formaat ipv mm/dd/jjjj
en de tijd in HH:mm:ss ipv hh:mm:ss AM|PM

Weet iemand hier nog een oplossing voor ?

[ Voor 70% gewijzigd door Plopeye op 01-12-2005 08:42 ]

Unix is user friendly, it's only selective about his friends.....


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
DateTime geeft gewoon een datum weer. Het is een structure die dus die datum bevat.

Als je een datum wilt 'outputten', dan zal je 'm naar je gewenste formaat moeten omzetten. Kijk eens naar de ToString() method van een datetime.
Verder heeft een datetime ook een aantal andere methods (ToShortDateString() bv), die volgens mij al rekening houden met de culture.
Kijk eens naar System.Thread.CurrentThread.CurrentCulture en CurrentUICulture.

https://fgheysels.github.io/


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 22-04 12:03
P_de_B schreef op woensdag 30 november 2005 @ 09:50:
Wil je die zogenaamde dot net goeroe nooit weer geloven, hij praat nl. onzin. Als je @@IDENTITY gebruikt krijg je (behoudens triggers) _altijd_ de correcte ID. @@IDENTITY is gelimiteerd tot je eigen scope.

@@IDENTITY is echt de defacto manier om dit te doen.
Volgens mij kun je beter Scope_Identity gebruiken.
SCOPE_IDENTITY and @@IDENTITY will return last identity values generated in any table in the current session. However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

Everyday's an endless stream, of cigarettes and magazines...


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
de 'current scope' is niet hetzelfde als de 'current sessie'.
Zolang je geen gebruik maakt van triggers, kan je @@identity probleemloos gebruiken.

https://fgheysels.github.io/


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 22-04 12:03
Maargoed, van te voren weet je nooit of je wel of niet triggers gaat gebruiken in een project (voortschreidend inzicht). Qua implementatie maakt het niet uit, en als je toch de keuze hebt. Better safe than sorry.

Everyday's an endless stream, of cigarettes and magazines...


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 30-03 07:25
Met die gedachte zal mijn raadgever dus ook aangegeven hebben om datetime.now.tostring en datetime.now.millisecond.tostring te gruiken... dan laat ik dat mooi zitten....

Wat betreft de CurrentCulture:

het schijnt dat je dit in je web.config kunt zetten alleen ik kan tot nu toe nergens vinden hoe...

Unix is user friendly, it's only selective about his friends.....


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
code:
1
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="nl-NL" uiCulture="nl-NL"/>

Zie ook : http://msdn.microsoft.com...fglobalizationsection.asp

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


Verwijderd

whoami schreef op donderdag 01 december 2005 @ 12:24:
de 'current scope' is niet hetzelfde als de 'current sessie'.
Zolang je geen gebruik maakt van triggers, kan je @@identity probleemloos gebruiken.
Dat is waar maar volgens mij retourneert Scope_Identity ook altijd de goede waarde als je geen triggers gebruikt. Dus als je Scope_Identity gebruikt hoef je je geen zorgen te maken als iemand later alsnog een trigger aan een tabel toevoegd. Bij @@identity zul je de code moeten gaan aanpassen.

Dus tenzij iemand een situatie weet waarin @@identity wel de goede waarde retourneert en Scope_Identity niet zou ik toch Scope_Identity prefereren.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Klopt, met scope_identity zit je altijd goed, behalve als je de identity van de waarde uit de trigger nodig hebt.

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
Verwijderd schreef op vrijdag 02 december 2005 @ 11:11:
[...]


Dat is waar maar volgens mij retourneert Scope_Identity ook altijd de goede waarde als je geen triggers gebruikt.
Idd, ik heb toch nooit anders beweert ?

https://fgheysels.github.io/


Verwijderd

whoami schreef op vrijdag 02 december 2005 @ 11:17:
[...]

Idd, ik heb toch nooit anders beweert ?
Nee, maar als ik de posts lees staat er eerst @@Identity is de defacto manier. Daarna zeg jij dat zolang je geen gebruik van triggers maakt dat @@Identity prima werkt.

Hiermee lijkt het alsof jij voor het gebruik van @@Identity bent. Ik zie echter een duidelijk voordeel in het gebruik van Scope_Identity namelijk de geschiktheid bij zowel de aan- als afwezigheid van triggers.

Feitelijk vindt ik dus dat we met zijn allen @@Identity zo snel mogelijk moeten vergeten en Scope_Identity de "defacto" manier moeten maken :)

Oftewel boycotten die @@Identity!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
@@identity wordt idd het meest gebruikt denk ik, maar dat is waarschijnlijk omdat er veel mensen zijn die scope_identity() niet kennen.

Ikzelf gebruik ook meestal scope_identity(), tenzij ik echt @@identity wil.

https://fgheysels.github.io/

Pagina: 1