Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von DateTime in einem SqlParameter für gespeicherte Prozeduren, Formatfehler

Wie richten Sie den SqlParameter ein ? Sie sollten den SqlDbType festlegen -Eigenschaft auf SqlDbType.DateTime und übergeben Sie dann DateTime direkt zum Parameter (NICHT in einen String konvertieren, dann fragen Sie nach einer Reihe von Problemen).

Sie sollten in der Lage sein, den Wert in die DB zu bekommen. Falls nicht, hier ist ein sehr einfaches Beispiel dafür:

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

Ich denke, ein Teil des Problems hier ist, dass Sie sich Sorgen machen, dass die Tatsache, dass die Zeit in UTC angegeben ist, nicht an SQL Server übermittelt wird. Zu diesem Zweck sollten Sie dies nicht tun, da SQL Server nicht weiß, dass eine bestimmte Zeit in einem bestimmten Gebietsschema/einer bestimmten Zeitzone liegt.

Wenn Sie den UTC-Wert speichern möchten, konvertieren Sie ihn in UTC, bevor Sie ihn an SQL Server übergeben (es sei denn, Ihr Server hat dieselbe Zeitzone wie der Clientcode, der DateTime generiert , und selbst dann ist das ein Risiko, IMO). SQL Server speichert diesen Wert, und wenn Sie ihn zurückbekommen, müssen Sie es selbst tun, wenn Sie ihn in Ortszeit anzeigen möchten (wobei die DateTime struct genügt).

Abgesehen davon, wenn Sie die Konvertierung durchführen und dann das konvertierte UTC-Datum übergeben (das Datum, das durch Aufrufen der ToUniversalTime -Methode, nicht durch Konvertieren in eine Zeichenfolge) in die gespeicherte Prozedur.

Und wenn Sie den Wert zurückbekommen, rufen Sie ToLocalTime auf Methode, um die Zeit in der lokalen Zeitzone abzurufen.