Avatar billede simsen Mester
27. juli 2009 - 23:50 Der er 6 kommentarer og
1 løsning

Datoformat virker ikke

Hej,

Nu VIL jeg altså have fat i det med datoer.

Mit problem: Jeg programmerer i asp.net (C#) - her sætter jeg en variabel til DateTime format, som jeg så kalder en Stored Procedure med, hvor jeg har lavet enparameter med SqlDbType.DateTime....

Jeg kan se, at den kommer ind som '01-01-1900 00:00:00' (som jeg også regner med)

I min storedprocedure spørger jeg så på datoen - hvis den er 01-01-1900 skal den sætte felt værdien til null i databasen.....

Det gør den bare ikke - den sætter den til datoen 01-01-1900 00:00:00

Min tabel er feltet sat som datetime :
editProductsCategoryEditedDate    datetime    Checked

Min stored procedure (som jeg laver i Visual Studio) ser ud som følgende:

[Microsoft.SqlServer.Server.SqlProcedure]
    public static void EditSetProductsMenuSpecific(int editProductsCategoryId, string editProductsCategoryName, string editProductsCategoryDescriptionContent,
        string editProductsCategoryDescription, string editProductsCategoryKeywords, int editProductsCategoryOrder, bool editProductsCategoryRelease,
        DateTime editProductsCategoryEditedDate, DateTime editProductsCategoryReleasedDate)
    {
        SqlConnection conn = new SqlConnection("Context Connection=true");
        SqlCommand cmd = new SqlCommand();

        cmd.Connection = conn;

        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryId", editProductsCategoryId)); //Id
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryName", editProductsCategoryName)); //Navn
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryDescriptionContent", editProductsCategoryDescriptionContent)); //Indholds beskrivelse
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryDescription", editProductsCategoryDescription)); //Beskrivelse søgeoptimering
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryKeywords", editProductsCategoryKeywords)); //Keywords
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryOrder", editProductsCategoryOrder)); //Rækkefølge
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryRelease", editProductsCategoryRelease)); //Udgivet
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryEditedDate", SqlDbType.DateTime)); //Ændret den
        cmd.Parameters["@editProductsCategoryEditedDate"].Value = editProductsCategoryEditedDate;
        cmd.Parameters.Add(new SqlParameter("@editProductsCategoryReleasedDate", SqlDbType.DateTime)); //Udgivet dato
        cmd.Parameters["@editProductsCategoryReleasedDate"].Value = editProductsCategoryReleasedDate;

        cmd.CommandText = @"

        BEGIN TRANSACTION
            BEGIN TRY       
                if @editProductsCategoryEditedDate = '01-01-1900 00:00:00'
                    BEGIN
                        set @editProductsCategoryEditedDate = null
                    END
                if @editProductsCategoryEditedDate = '01-01-1900 00:00:00'
                    BEGIN
                        set @editProductsCategoryEditedDate = null
                    END

                BEGIN
                    UPDATE EditProductsCategory
                      SET  editProductsCategoryName = @editProductsCategoryName,
                            editProductsCategoryDescriptionContent = @editProductsCategoryDescriptionContent,
                            editProductsCategoryDescription = @editProductsCategoryDescription,
                            editProductsCategoryKeywords = @editProductsCategoryKeywords,
                            editProductsCategoryOrder = @editProductsCategoryOrder,
                            editProductsCategoryRelease = @editProductsCategoryRelease,
                            editProductsCategoryEditedDate = @editProductsCategoryEditedDate,
                            editProductsCategoryReleasedDate = @editProductsCategoryReleasedDate
                    WHERE editProductsCategoryId = @editProductsCategoryId
                END
                COMMIT TRANSACTION
            END TRY
            BEGIN CATCH
                ROLLBACK TRANSACTION
            END CATCH";

        conn.Open();

        SqlDataReader rdr = cmd.ExecuteReader();
        SqlContext.Pipe.Send(rdr);

        rdr.Close();
        conn.Close();
    }

Det skal siges, hvis jeg forsøger at execute stored procedure fra MS SQL Manager med datoen 28-07-2009 får jeg følgende fejl:
Msg 8114, Level 16, State 1, Procedure EditSetProductsMenuSpecific, Line 0
Error converting data type varchar to datetime.

Hvis jeg derimod tager datoen 07-28-2009 så går den fint igennem i MS SQL Manageren.

Så jeg tror, det har noget at gøre med, at SQL serveren ikke opfatter det som en dansk dato men f.eks. engelsk indtil den lægger den ind - for den vises i tabellen som 28-07-2009...

Nogen der kan hjælpe mig med mit problem?

mvh
simsen :-)
Avatar billede arne_v Ekspert
28. juli 2009 - 00:12 #1
Var det ikke nemmere at sætte parameteren til NULL i C# fremfor i T-SQL hvis betingelsen er opfyldt?
Avatar billede simsen Mester
28. juli 2009 - 00:44 #2
Hej Arne,

Hvis jeg forsøger at sætte parameteren til null i koden, får jeg at vide, det ikke er tilladt.......Derfor min 01-01-1900 - så jeg har noget at spørge på :-)
Avatar billede arne_v Ekspert
28. juli 2009 - 00:50 #3
En C# DateTime kan ikke være null (en DateTime? kan dog).

Mit forslag var dog mere:

if(dindatetimeval == VALUE_SOM_BETYDER_NULL)
{
    cmd.Parameter["@noget"].Value = DBNull.Value;
}
else
{
    cmd.Parameter["@noget"].Value = dindatetimeval;
}
Avatar billede simsen Mester
28. juli 2009 - 01:02 #4
Arne

Du er som sædvanlig bare en engel......

Mit eneste problem er, om jeg nu også får problemer, når jeg skal ind og spørge på datoen, hvor jeg har haft problemer før.... Lige nøjagtig fordi den tager datoen anderledes...

Men den må jeg tage til den tid, når jeg kommer så langt.

Smid et svar og mange tak for hjælpen. Havde slet ikke tænkt den tanke, jeg kunne gøre det sådan :-)

mvh
simsen :-)
Avatar billede arne_v Ekspert
28. juli 2009 - 03:53 #5
Brug af parameters skulle løse alle US versus DK tidsformat problemer.

Men der kan jo da altid opstå andre problemer.

----

Og et svar.

----

Kunne du ikke forsimple:

ASP.NET/C#---(SP kald)--->CLR SP (C#)---(SQL kald)--->T-SQL statement

til:

ASP.NET/C#---(SQL kald)--->T-SQL statement

??
Avatar billede arne_v Ekspert
28. juli 2009 - 03:54 #6
om igen
Avatar billede simsen Mester
28. juli 2009 - 09:36 #7
Hej Arne,

Hvordan mener du?

Jeg laver mine stored procedures i VS (nemmere at udgive til forskellige databaser)

Jeg kalder stored procedures via VS C#.

Så ja - jeg laver nok dit første eksempel.

Kan du give et eksempel på dit andet forslag?

mvh
simsen :-)
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