Avatar billede websam Nybegynder
07. oktober 2007 - 11:00 Der er 32 kommentarer og
1 løsning

DateTime der driller lidt

Hejsa,

Jeg tror jeg har stirret mig blind på en DateTime jeg ikke kan lave DateTime.Now på. Min Constructor ser sådan ud :

public NewsItem()
{
    _id = 0;
    _headline = "";
    _description = "";
    _imageUrl = "";
    _imageAltText = "";
    _siteTitle = "";
    _metaDescription = "";
    _metaSearchwords = "";
    _visible = false;
    _addDate = DateTime.Now;
    _editDate = DateTime.Now;
    _addBy = 0;
    _editBy = 0;
    _hits = 0;
}

Field og property til _addDate og _editDate ser sådan ud :

public DateTime AddDate
{
    get { return _addDate; }
    set { _addDate = value; }
}

public DateTime EditDate
{
    get { return _editDate; }
    set { _editDate = value; }
}

Men når jeg forsøger at kalde min klasse for at indsætte en record i databasen med denne kode :

Conn.Open();
SqlCommand cmd = new SqlCommand("news_CreateNews", Conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Headline", news.Headline));
cmd.Parameters.Add(new SqlParameter("@Description", news.Description));
cmd.Parameters.Add(new SqlParameter("@ImageUrl", news.ImageUrl));
cmd.Parameters.Add(new SqlParameter("@ImageAltText", news.ImageAltText));
cmd.Parameters.Add(new SqlParameter("@SiteTitle", news.SiteTitle));
cmd.Parameters.Add(new SqlParameter("@MetaDescription", news.MetaDescription));
cmd.Parameters.Add(new SqlParameter("@MetaSearchwords", news.MetaSearchwords));
cmd.Parameters.Add(new SqlParameter("@Visible", news.Visible));
cmd.Parameters.Add(new SqlParameter("@AddDate", news.AddDate));
cmd.Parameters.Add(new SqlParameter("@EditDate", news.EditDate));
cmd.Parameters.Add(new SqlParameter("@AddBy", news.AddBy));
cmd.Parameters.Add(new SqlParameter("@EditBy", news.EditBy));
cmd.Parameters.Add(new SqlParameter("@Hits", news.Hits));
int executed = cmd.ExecuteNonQuery();

Min dato bliver til 01-01-0001 00:00:00 og så fejler koden med :

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Håber der sidder en derude der kan hjælpe mig med denne ;o)

/Websam
Avatar billede kalp Novice
07. oktober 2007 - 14:44 #1
Du skriver hvad værdien i din dato er, men er det hvad din db fejl fortæller dig?
for bør du nok selv tjekke efter.

Jeg synes mere det ligner din database som er mystisk for hvis dato'en skal være mellem det som den nævner er det ret forældet dato'er du kan arbejde med:) i hvertfald hvis du kun må have dato'er til slutningen af 1999;)
Avatar billede kalp Novice
07. oktober 2007 - 14:45 #2
ps. går ud fra du har valgt datatypen "DateTime" ikke smalldatetime eller timestamp.
ved ikke om det har nogen betydning, men så er det nævnt:)
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 14:54 #3
Til slutningen af 9999 - det er ok for mig i de fleste tilfælde... men ja, hvad er typen af felterne i databasen?
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 14:55 #4
Og: bliver der ændret i properties AddDate eller EditDate ud fra noget brugeren indtaster?
Avatar billede kalp Novice
07. oktober 2007 - 14:57 #5
hehe som jeg skrev - 1999 så overså lige det var et par 9taller;o)
Avatar billede arne_v Ekspert
07. oktober 2007 - 16:31 #6
Jeg tror at spørgsmålet 14:54:02 er det kritiske spørgsmål !

Den postede kode ser OK ud.

(bortset fra at jeg ville angive typer til de SqlParameter)

Der må ske "noget" i noget andet kode.
Avatar billede websam Nybegynder
07. oktober 2007 - 17:21 #7
Ok jeg tager den fra starten af.

1. Der er tale om en MsSql 2000 database og feltet er af typen datetime.

2. Der ændres ikke i properties af brugeren.

3. og den fulde fejl fra der vises ser sådan ud :

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Source Error:


Line 47:                    cmd.Parameters.Add(new SqlParameter("@EditBy", news.EditBy));
Line 48:                    cmd.Parameters.Add(new SqlParameter("@Hits", news.Hits));
Line 49:                    int executed = cmd.ExecuteNonQuery();
Line 50:                    if (executed > 0)
Line 51:                    {
Avatar billede arne_v Ekspert
07. oktober 2007 - 17:29 #8
Prøv og udskriv news.EditBy lige inden og se om den indeholder det den skal.

Prøv evt. også at put en type på den SqlPararemeter.
Avatar billede websam Nybegynder
07. oktober 2007 - 18:18 #9
Jeg har sat SqlType på alle parameters og alle fields bortset fra addDate og editDate indeholder det de skal.

Så jeg er ved at være noget gråhåret over denne ;o)
Avatar billede websam Nybegynder
07. oktober 2007 - 18:26 #10
Jeg har også prøvet med at skrive new DateTime(2007, 01, 01) og jeg får stadigt den samme dato 01-01-0001 00:00:00
Avatar billede arne_v Ekspert
07. oktober 2007 - 18:41 #11
Hvordan er argumentet erklæret i SP'en ?
Avatar billede websam Nybegynder
07. oktober 2007 - 18:46 #12
Min sp ser således ud :

CREATE PROCEDURE [dbo].[news_CreateNews]
    @Headline            nvarchar(100),
    @Description        ntext,
    @ImageUrl            nvarchar(100),
    @ImageAltText        nvarchar(100),
    @SiteTitle            nvarchar(100),
    @MetaDescription    nvarchar(500),
    @MetaSearchwords    nvarchar(500),
    @Visible            bit,
    @AddDate            datetime,
    @EditDate            datetime,
    @AddBy                int,
    @EditBy                int,
    @Hits                int
AS
    INSERT INTO tbl_news
            (Headline, Description, ImageUrl, ImageAltText,
            SiteTitle, MetaDescription, MetaSearchwords,
            Visible, AddDate, EditDate, AddBy, EditBy, Hits)
    VALUES
            (@Headline, @Description, @ImageUrl, @ImageAltText,
            @SiteTitle, @MetaDescription, @MetaSearchwords,
            @Visible, @AddDate, @EditDate, @AddBy, @EditBy, @Hits)
    SELECT Cast(SCOPE_IDENTITY() as int) Id
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 19:43 #13
Jeg ved det ikke, men store felter, her: ntext, giver sommetider mere bøvl end ret bør være. Vil du prøve at flytte din Description didst i parameterlisten (både erklæring og parameters), og sidst i INSERT-sætningens feltnavne og values. Du behøver ikke gøre noget i selve databasen. Ingen garanti (men så går tiden da med det, *g* )
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 19:43 #14
Og vi oversætter lige fra jydsk: 'didst' hedder nok 'sidst' andre steder i landet ;)
Avatar billede websam Nybegynder
07. oktober 2007 - 20:01 #15
Det hjalp desværre heller ikke jeg får stadigt den samme fejl :

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Og det er sq da utroligt for jeg har da aldrig haft de problemer med feltet datetime i databasen.
Avatar billede neoman Novice
07. oktober 2007 - 21:04 #16
Jeg synes ikke det i de forudgående indlæg er blevet afklaret HVOR fejlen indtræder.

Der blev 07/10-2007 17:29:25 foreslået at kigge på hvad du fodrer ind i din parameter - kan ikke helt se noget som entydigt beskriver om du har prøvet det eller ej:)

Hvis det var mig så ville jeg checke hvad din news.AddDate leverer, samt prøve at skrive direkte cmd.Parameters.Add(new SqlParameter("@AddDate", Now())); for at se om det er et eller andet i sql'en som fejler.
Avatar billede websam Nybegynder
07. oktober 2007 - 21:34 #17
Det er nok fordi jeg ikke fik det med, men hvis jeg skriver datetime.now i min parameter kommer datoen fint med over i databasen så det må være imellem min NewsItem klasse og Sql klassen at noget går galt jeg har bare ikke fundet ud af hvor endnu :o(
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 21:37 #18
Og hvis du udskriver  news.AddDate  inden du kører din SQL-sætning, hvad står der så?
Avatar billede websam Nybegynder
07. oktober 2007 - 21:47 #19
Så udskriver den 01-01-0001 00:00:00 til skærmen så det må som jeg skriver ligge et sted imellem de 2 klasser
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 21:48 #20
Ja, og så har det intet med SQL-en at gøre. Hvis jeg taber en 25-øre i Tunesien, leder jeg heller ikke efter den i Memphis ;)
Avatar billede neoman Novice
07. oktober 2007 - 22:17 #21
Det skulle vel ikke være en klassiker ? Altså det at du laver et eller andet postback efter at din klasse har fået værdier og først efterfølgende kalder din gemme-routine, hvor din klasse er buldrende tom, medmindre du har gemt den i noget session eller noget :-)
Avatar billede websam Nybegynder
07. oktober 2007 - 22:21 #22
Jeg benytter en detailsview out of the box og nå alle felter i debug viser det rigtige lige inden det gemmes så tror jeg ikke det er der det er galt.
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 22:21 #23
Lige det bør ikke kunne ske, når klassens constructor putter værdier i de 2 datofelter, og når resten af felterne er korrekte.

Men hvis det ikke er en klassiker, når vi finder fejlen, kan vi jo gøre det til en ;)
Avatar billede erikjacobsen Ekspert
07. oktober 2007 - 22:22 #24
Hvordan ser din dato ud i dit detailsview?
Avatar billede websam Nybegynder
07. oktober 2007 - 22:27 #25
da jeg satte en record manuelt ind i databasen vises den helt fint detailsview'et dog skal det siges at addDate og editDate ikke bliver bruger defineret da disse blot skal bruges til log og derfor skal sættes automatisk med datetime.now i koden
Avatar billede neoman Novice
07. oktober 2007 - 22:45 #26
Når jeg kører fast i sådan noget så plejer jeg at tage de relevante kodestumper og bygge det hele op op igen fra ground zero, og som regel forsvinder fejlen uden videre forklaring:) Eftersom dette her har stået på i en hel stund, så ville jeg foreslå dig at  stable en testside op og tage den derfra, fremfor at rode rundt i samme gylle:)
Avatar billede websam Nybegynder
07. oktober 2007 - 22:50 #27
Ja det ender det sq nok oxo op med at jeg gør, men det er sq da pisse irriterende at jeg ikke bare kan finde fejlen.
Avatar billede kalp Novice
07. oktober 2007 - 23:44 #28
Det nemmeste du kan gøre er, at sætte breakpoints i dine properties.
Det gør, at kan følge hvert kald der bliver gjort imod de 2 variabler.

Vigtigt er det, at du selvfølgelig gør begge variabler private og at du benytter dine properties hver gang du skal pille ved dem.

Det gør det f.eks ikke nu i konstruktøren.

_addDate = DateTime.Now;
_editDate = DateTime.Now;

skal lige rettes til, at benytte set properties du har tilrådighed.

Dette betyder så, at alle kald der evt. er i din kode, som vi ikke kan se vil blive fanget af din compiller hvis altså du rettede direkte i dine variabler og de var public..

anyways.. lav rettelserne og læg dine breakpoints så havner du i dine properties hver gang der skal pilles ved variablerne og du kan på den måde "følge" ændringer der sker i dem.

hvis den breaker og du kan se dato'erne ser forkerte ud så F10/F11 så du kan se hvorfra de blev kaldt sidst..
Avatar billede erikjacobsen Ekspert
08. oktober 2007 - 08:41 #29
Gør gerne som kalp siger, men kommer datoerne ikke fra dit detailsview, selv om det ikke er brugeren, der gør det? Og visningsformatet kan ikke nødvendigvis konverteres tilbage. Derfor: hvordan ser de ud, og hvad står der i dit detailsview?
Avatar billede karl-koder Nybegynder
08. oktober 2007 - 10:43 #30
Jeg formoder at du prøver at oprette en ny record fra dit detailsview ? Men har du prøvet at lave en simpel formular med et felt til din overskrift og så lave en constructor med "string headline" som den eneste variabel bare for at se hvad der så sker med datoerne ?

Det er vel ingen skade til at prøve ;o)
Avatar billede kalp Novice
09. oktober 2007 - 16:59 #31
har du fundet frem til årsagen? det er jo interessant nok at vide.
Avatar billede websam Nybegynder
11. oktober 2007 - 16:36 #32
Undskyld forsinkelsen, men jeg har ligget syg så ikke været ved computeren de sidste par dage.

Jeg har ikke fundet ud af hvorfor at den ikke vil med datetime i et detailsview. Laver jeg derimod en formular virker alt efter hensigten.

Jeg har dog en lille mistanke til at jeg måske har trukket i en forkert klasse i min provider så det skal jeg selvfølgelig lige have testet.

/Websam
Avatar billede karl-koder Nybegynder
20. februar 2009 - 01:45 #33
Lukketid ?
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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



IT-JOB

Udviklings- og Forenklingsstyrelsen

ITSM-koordinator

Udviklings- og Forenklingsstyrelsen

Erfaren udvikler/DevOps til Integrationsplatforme

Magasin

IT-projektleder

Unik System Design A/S

Head of Internal IT