sql >> Databáze >  >> RDS >> Sqlserver

Při použití DateTime v SqlParameter pro uloženou proceduru došlo k chybě formátu

Jak nastavujete SqlParameter ? Měli byste nastavit SqlDbType vlastnost na SqlDbType.DateTime a poté předejte DateTime přímo na parametr (NEpřevádějte na řetězec, pak si koledujete o spoustu problémů).

Měli byste být schopni získat hodnotu do DB. Pokud ne, zde je velmi jednoduchý příklad, jak to udělat:

static void Main(string[] args)
{
    // Create the connection.
    using (SqlConnection connection = new SqlConnection(@"Data Source=..."))
    {
        // Open the connection.
        connection.Open();

        // Create the command.
        using (SqlCommand command = new SqlCommand("xsp_Test", connection))
        {
            // Set the command type.
            command.CommandType = System.Data.CommandType.StoredProcedure;

            // Add the parameter.
            SqlParameter parameter = command.Parameters.Add("@dt",
                System.Data.SqlDbType.DateTime);

            // Set the value.
            parameter.Value = DateTime.Now;

            // Make the call.
            command.ExecuteNonQuery();
        }
    }
}

Myslím, že součástí problému je, že se obáváte, že skutečnost, že čas je v UTC, není přenášena na SQL Server. Za tímto účelem byste neměli, protože SQL Server neví, že určitý čas je v určitém národním prostředí/časovém pásmu.

Pokud chcete uložit hodnotu UTC, převeďte ji na UTC, než ji předáte SQL Server (pokud váš server nemá stejné časové pásmo jako klientský kód generující DateTime a i tak je to riziko, IMO). SQL Server si tuto hodnotu uloží a až ji získáte zpět, pokud ji chcete zobrazit v místním čase, musíte to udělat sami (což DateTime struct to snadno udělá).

Vše, co bylo řečeno, pokud provedete převod a poté předáte převedené datum UTC (datum, které se získá voláním ToUniversalTime metodou, nikoli převodem na řetězec) do uložené procedury.

A až získáte hodnotu zpět, zavolejte ToLocalTime metoda k získání času v místním časovém pásmu.



  1. Řadit podle data a času v sestupném pořadí?

  2. Jak najdu v MySQL znaky jiné než ASCII?

  3. Proč je 1899-12-30 nulové datum v Access / SQL Server místo 12/31?

  4. LINQ to SQL více tabulek levé vnější spojení