Avatar billede mn Nybegynder
24. januar 2007 - 21:20 Der er 10 kommentarer og
1 løsning

SQL 2005 stored proc parameter datetime

Hej,

Jeg oplever noget meget mystisk. Jeg har en .net webapplikation hvorfra jeg ønsker at kalde en stored proc og gemme nogle værdier. Det er meget banalt, så jeg må overse et eller andet.

Det går galt med en datetime parameter, som fx kunne se sådan her ud :

cmd.Parameters["@start"].Value = DateTime.Now;

Jeg får så at vide at der går noget galt og når jeg kører sql profiler, kan jeg se at kaldet i sin helhed ser ud som følger når det rammer sql-serveren :

exec SaveProjectTask @id=NULL,@code=N'02',@title=N'asdf',@description=N'asdf',@longtext=N'asdf',@start=''2007-01-24 21:15:09:923'',@end=''2007-01-24 21:15:09:923'',@peid=1,@pid=3,@sid=1,@documented=0

Når man ser på stedet med @start og @end ses det at der indsættes to apostroffer, datoen og så igen to appostroffer.

Hvis jeg indsætter det og kører det manuelt ser jeg klart at det går galt. Det skal kun være en apostrof før og en efter. Eller det skal gøres via CONVERT eller noget andet. Men. Jeg bruger jo bare .net's SqlCommand-klasse og stikker den en .Net DateTime.
Parameteren er tilføjet som SqlType.DateTime, så jeg mener at det er som det bør være.

Jeg har gjort dette en milliard gange op mod sql2000, så det må være eeeet eller andet ift sql2005. Det er det første jeg laver på den.
Problemet kan også ligge i min stored proc. Den indsættes her:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[SaveProjectTask]
    (
    @id int, @code nvarchar(50), @title nvarchar(200), @description nvarchar(500), @longtext nvarchar(4000),
    @start datetime, @end datetime, @peid int, @pid int, @sid int, @documented bit
    )
AS
BEGIN
    SET NOCOUNT ON;

    if (@id = NULL)
    begin
        insert into dbo.tblProjectTask (ptCode, ptTitle, ptDescription, ptLongText, ptStart, ptEnd, pt_peID, pt_pID, pt_sID, ptDocumented)
            values (@code, @title, @description, @longtext, @start, @end, @peid, @pid, @sid, @documented)
        return @@identity
    end
    else
    begin
        update dbo.tblProjectTask set
            ptCode=@code, ptTitle=@title, ptDescription=@description, ptLongText=@longtext,
            ptStart=@start, ptEnd=@end, pt_peID=@peid, pt_pID=@pid, pt_sID=@sid, ptDocumented=@documented
        where ptID=@id
    end
END



Håber der er andre der har været i min situation. Har googlet på det uden held, så lad eksperterne tale!

Mvh. Morten
Avatar billede arne_v Ekspert
25. januar 2007 - 01:03 #1
hvilken fejlmeddelelse får du ?
Avatar billede mn Nybegynder
25. januar 2007 - 02:01 #2
Det er også lidt spøjst. I web-applikationen får jeg ikke nogen fejl. Jeg får bare ikke noget tilbage fra @@identity. Eller rettere jeg får et 0.

Hvis jeg så slår sql profiler til for at se hvad der sker under hjelmen, og jeg så selv manuelt prøver at fyre kaldet (indsat i det første indlæg) af får jeg følgende fejl :

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '2007'.

Det er ikke så sært at den brokker sig. Jeg sætter jo i princippet parameteren @start='' og derefter kommer der så 2007 - helt uden for kontekts. Det er jo syntax fejl. Men... Det er lidt sært, for jeg bygger ikke kaldet selv. Jeg bruger .NET klasserne.

Kan det mon have noget med "set QUOTED_IDENTIFIER ON" at gøre? Den plejer ikke at stå der i sql2000...

Skriv endelig hvis jeg skal uddybe noget!
Avatar billede dr_chaos Nybegynder
25. januar 2007 - 07:46 #3
prøv at fjerne
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
Avatar billede mn Nybegynder
25. januar 2007 - 12:43 #4
De to linjer er i princippet ikke en del af sp'en. Hvis jeg fjerner dem, eller kun kører alter procedure delen, og jeg så højreklikker på sp'en, og vælger modify vises de igen.
Det må være en generel database setting, for de står stadig "on".

Morten
Avatar billede dr_chaos Nybegynder
25. januar 2007 - 12:46 #5
hvor kalder du din sp fra ?
Avatar billede mn Nybegynder
25. januar 2007 - 13:51 #6
Fra ASP.NET 2.0. Database og applikation ligger på samme maskine
Avatar billede dr_chaos Nybegynder
25. januar 2007 - 13:54 #7
hvordan ser koden ud som kalde din sp og hvor kommer date værdierne fra.
Avatar billede mn Nybegynder
25. januar 2007 - 14:06 #8
Oh my god.....

if (@id = NULL) skal være  if (@id is NULL)

Nogle gange går man bare efter den mest avancerede muligheder i stedet for at se fejlen der er lige foran næsen på en..... Det skal siges til mit forsvar at man godt kunne bruge "lig med" på sql2000 :P

Tak fordi I har ville bruge tid på mig. Giv mig et svar begge to, så får I points.


Mvh. Morten
Avatar billede dr_chaos Nybegynder
25. januar 2007 - 14:16 #9
ok svar :)
Avatar billede arne_v Ekspert
26. januar 2007 - 01:26 #10
ikke til mig - mit eneste indlæg havde '?' som sidste tegn
Avatar billede mn Nybegynder
26. januar 2007 - 09:16 #11
tak for indsatsen alligevel :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester