Toon posts:

[VB.NET] Datetime in SQL Insert afvuren op SQL2000 problems

Pagina: 1
Acties:

Verwijderd

Topicstarter
Applicatie; In VB.net gemaakt
Database; SQL2000

Op mijn applicatie is een knop 'reserveren' die de volgende zaken behandeld

Start en Eind zijn gedefineerd (dim) als datetime

Start = CDate(Me.dtp_Start.Value & " " & Me.cbo_StartHH.Text & ":" & Me.cbo_StartMM.Text)
Eind = CDate(Me.dtp_Eind.Value & " " & Me.cbo_EindHH.Text & ":" & Me.cbo_EindMM.Text)

Bovenstaande stukje code maakt er een (in mijn ogen) een geschikte datum van output is bijvoorbeeld: 8-12-2004 9:00:00

Het veld op de SQLserver is DateTime (lengte 8 ) ... na het samenstellen van de datums wordt de query samengesteld;

(in vb.net staat de query op één regel, daar hoef je hier dus niet naar te kijken)
sqlQuery = "INSERT INTO UITLEEN (CTE_ID, PSN_ID, RESERVERING_START, RESERVERING_EIND, UITLEENSTATUS, RESERVEERVLAG) VALUES (" & Me.cbo_Categorie.SelectedValue & ", '" & Me.cbo_gebruikerscode.SelectedValue & "', '" & CStr(Start) & "', '" & CStr(Eind) & "', 'gereserveerd', 'T')"

resultaat = ws.SQLnonquery(sqlQuery)


De query output (heb ik even in debug mode er uit getrokken is als volgt;

INSERT INTO UITLEEN (CTE_ID, PSN_ID, RESERVERING_START, RESERVERING_EIND, UITLEENSTATUS, RESERVEERVLAG) VALUES (16, 'C0000031752', '13-12-2004 9:01:00', '13-12-2004 9:04:00', 'gereserveerd', 'T')

Niets mis mee, de datum staat hier tussen ' ',' dan krijg ik een foutmelding over een char to datetime conversie (out of range)

Gebruiker ik geen ' ' bij de datum dan hikt hij al op de eerste spatie. (logisch lijkt me)

Hoe krijg ik die query werkend? Gebruik ik onjuiste conversie? :(

[ Voor 13% gewijzigd door Verwijderd op 13-12-2004 10:56 ]


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

gorgi_19

Kruimeltjes zijn weer op :9

Probeer eens met parametrized queries te gaan werken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op maandag 13 december 2004 @ 10:57:
Probeer eens met parametrized queries te gaan werken.
Sorry even wat vergeten. Parameter querys zou eventueel kunnen. 'Probleem' is dat de query in de applicatie wordt samengesteld. (zoals bovenaan staat) deze wordt afgevuurd op mijn webservice... en de webservice staat weer in contact met SQL2000.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
Ehm, dus, eigenlijk 'weet' je applicatie niets af van de DB (want de webservice) zit er tussen, maar eigenlijk weet ze er dan weer wel wat vanaf, want de applicatie bouwt de query op, dus moet ze de structuur van je DB kennen ?

Sounds like niet goed....

Als je het via een webservice doet, laat dan de webservice die query opbouwen. Op die manier hoef je slechts je webservice aan te passen als er iets aan je DB veranderd, en kan je parametrized queries gaan gebruiken.
Zo is je DB logica afgeschermt van je applicatie

[ Voor 24% gewijzigd door whoami op 13-12-2004 11:02 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op maandag 13 december 2004 @ 11:01:
Op die manier hoef je slechts je webservice aan te passen als er iets aan je DB veranderd, en kan je parametrized queries gaan gebruiken.
Zo is je DB logica afgeschermt van je applicatie
good point.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Parameterized queries is de goede oplossing.
Als dat nu niet kan: het probleem wordt veroorzaakt doordat SQL Server de datum in een andere volgorde dan dd-mm-jjjj verwacht (vermoedlijk mm-dd-jjjj (stomme yanks!) ). Daarom herkent hij de datum niet. Je kunt zelf met het commando SET DATEFORMAT de volgorde wijzigen.

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


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je kunt ook in je query een conversie opnemen naar datetime (nu laat je dat over aan SQLServer). Je kunt met zo'n conversie aangeven welk format je gebruikt voor de datum.

Het gaat om CONVERT( datetime, <datumstring), <style> )

Je kunt deze functie vinden in de Transact SQL reference in Books Online.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
Mjah, je kan het wel zo oplossen, maar ik vind dat maar 'hacken'. Het is imo een lapmiddel om het snel werkend te krijgen maar een mooie (en goede) oplossing is het imo niet.

Er is iets fundamenteels fout (de applicatie weet iets van de DB, terwijl de webservice dit normaal allemaal afhandeld). Verplaats die logica dus naar de webservice, en het probleem is opgelost.

https://fgheysels.github.io/


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Maar om van alle problemen af te zijn gebruik je in queries het ISO formaat ( jaar-maand-dag uren:minuten:seconden ) en dan gaat het altijd goed.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
farlane schreef op maandag 13 december 2004 @ 11:15:
Maar om van alle problemen af te zijn gebruik je in queries het ISO formaat ( jaar-maand-dag uren:minuten:seconden ) en dan gaat het altijd goed.
Of parametrized queries. :)
Geen conversie gedoe meer, zelf geen rekening meer houden met speciale characters, quotes, etc....

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik heb na intensief googlen' en jullie reacties besloten om toch maar voor
parameterized queries te gaan. Deze op de webservice te gebruiken. Dan
ben ik in één keer van al het gezeur af.

En tevens blijft mijn applicatie dan transparant (de db gegevens zitten
dan dus op de webservice (waar ze thuishoren))

Verwijderd

Topicstarter
ZUCHT!
Aanroepende code vanuit VB.NET
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  Private Sub btn_Reserveren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Reserveren.Click
        Dim sqlQuery As String
        Dim resultaat As Integer
        Dim Start As DateTime
        Dim Eind As DateTime
        Dim Status As String = "gereserveerd"
        Dim Vlag As String = "F"

        Start = CDate(Me.dtp_Start.Value & " " & Me.cbo_StartHH.Text & ":" & Me.cbo_StartMM.Text)
        Eind = CDate(Me.dtp_Eind.Value & " " & Me.cbo_EindHH.Text & ":" & Me.cbo_EindMM.Text)

        resultaat = ws.PlaatsReservering(Me.cbo_Categorie.SelectedValue, Me.cbo_gebruikerscode.SelectedValue, Start, Eind, Status, Vlag)

    End Sub



VERWERKENDE CODE WEBSERVICE
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <WebMethod()> Public Function PlaatsReservering(ByVal cte_id As Integer, ByVal psn_id As String, ByVal start As Date, ByVal eind As Date, ByVal uitleenstatus As String, ByVal reserveervlag As String) As Integer
        Dim sqlQuery
        sqlQuery = "INSERT INTO UITLEEN (CTE_ID, PSN_ID, RESERVERING_START, RESERVERING_EIND, UITLEENSTATUS, RESERVEERVLAG) VALUES (@CTE_ID, @PSN_ID, @START, @EIND, @STATUS, @VLAG)"

        Dim Cmd As New System.Data.SqlClient.SqlCommand(sqlQuery, Me.HULP3_SQL_CONNECTIE)

        Cmd.Parameters.Add("@CTE_ID", SqlDbType.Int).Value = cte_id
        Cmd.Parameters.Add("@PSN_ID", SqlDbType.VarChar).Value = psn_id
        Cmd.Parameters.Add("@START", SqlDbType.DateTime).Value = start
        Cmd.Parameters.Add("@EIND", SqlDbType.DateTime).Value = eind
        Cmd.Parameters.Add("@STATUS", SqlDbType.VarChar).Value = uitleenstatus
        Cmd.Parameters.Add("@VLAG", SqlDbType.VarChar).Value = reserveervlag

        Me.HULP3_SQL_CONNECTIE.Open()
        Dim Resultaat As Integer

        Resultaat = Cmd.ExecuteNonQuery()
        Return Resultaat

        Me.HULP3_SQL_CONNECTIE.Close()
    End Function


Krijg ik de melding:
An unhandled exception of type 'System.Web.Services.Protocols.SoapException' occurred in system.windows.forms.dll

Additional information: Server was unable to read request. --> There is an error in XML document (1, 371). --> String was not recognized as a valid DateTime.


Sniff :( Ik snap er geen reet meer van.
In de tabel uitleen staan al records (zijn ingevoerd middels de enterprise manager) met de waarde 22-9-1999 9:36:38 in een datetime kolom.

De string heeft precies dezelfde vorm (uit applicatie) heeft precies dezelfde stijl.

[ Voor 11% gewijzigd door Verwijderd op 13-12-2004 12:21 ]


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

gorgi_19

Kruimeltjes zijn weer op :9

Gokje; beiden hebben een verschillende regional setting?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op maandag 13 december 2004 @ 12:21:
Gokje; beiden hebben een verschillende regional setting?
Dan zou (zie edit) wat hierboven geschreven staat toch ook niet kunnen

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
Wat je zou kunnen doen, is die datums doorgeven aan de webservice als een string.

Je converteert de datum naar een string dmv de XmlConvert class en je laat de webservice die string dan weer naar een datum converteren, ook met de XmlConvert class.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op maandag 13 december 2004 @ 12:24:
Wat je zou kunnen doen, is die datums doorgeven aan de webservice als een string.

Je converteert de datum naar een string dmv de XmlConvert class en je laat de webservice die string dan weer naar een datum converteren, ook met de XmlConvert class.
Whoami! Works like a charm! EINDELIJK. Ik haat dit soort problemen. Dat eindeloze
puzzelen en schuiven en zoeken. :) Maar het gaat dan om het eindresultaat... ik heb
deze oplossing nog wel meer dan één keer nodig :)
Pagina: 1