Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzando DateTime in un SqlParameter per Stored procedure, errore di formato

Come stai configurando il SqlParameter ? Dovresti impostare il SqlDbType proprietà su SqlDbType.DateTime e quindi passare il DateTime direttamente al parametro (NON convertire in una stringa, allora stai chiedendo un sacco di problemi).

Dovresti essere in grado di ottenere il valore nel DB. In caso contrario, ecco un esempio molto semplice di come farlo:

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();
        }
    }
}

Penso che parte del problema qui sia che sei preoccupato che il fatto che l'ora sia in UTC non venga trasmesso a SQL Server. A tal fine, non dovresti, perché SQL Server non sa che una determinata ora si trova in una particolare locale/fuso orario.

Se desideri archiviare il valore UTC, convertilo in UTC prima di passarlo a SQL Server (a meno che il tuo server non abbia lo stesso fuso orario del codice client che genera il DateTime , e anche allora, questo è un rischio, IMO). SQL Server memorizzerà questo valore e quando lo riavrai indietro, se vuoi visualizzarlo nell'ora locale, devi farlo da solo (che il DateTime struct lo farà facilmente).

Detto questo, se esegui la conversione e poi passi la data UTC convertita (la data che si ottiene chiamando il ToUniversalTime metodo, non convertendo in una stringa) nella procedura memorizzata.

E quando ottieni il valore indietro, chiama ToLocalTime metodo per ottenere l'ora nel fuso orario locale.