sql >> Database >  >> RDS >> Sqlserver

DateTime gebruiken in een SqlParameter voor opgeslagen procedure, formatteerfout

Hoe stel je de SqlParameter in? ? U moet het SqlDbType . instellen eigenschap naar SqlDbType.DateTime en geef dan de DateTime . door direct naar de parameter (niet converteren naar een string, dan vraag je om een ​​heleboel problemen).

U zou de waarde in de DB moeten kunnen krijgen. Zo niet, dan is hier een heel eenvoudig voorbeeld van hoe u dit moet doen:

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

Ik denk dat een deel van het probleem hier is dat u zich zorgen maakt dat het feit dat de tijd in UTC is, niet wordt doorgegeven aan SQL Server. Dat zou u niet moeten doen, omdat SQL Server niet weet dat een bepaalde tijd zich in een bepaalde landinstelling/tijdzone bevindt.

Als u de UTC-waarde wilt opslaan, converteert u deze naar UTC voordat u deze doorgeeft aan SQL Server (tenzij uw server dezelfde tijdzone heeft als de clientcode die de DateTime genereert) , en zelfs dan is dat een risico, IMO). SQL Server slaat deze waarde op en wanneer u deze terugkrijgt, als u deze in lokale tijd wilt weergeven, moet u dit zelf doen (wat de DateTime struc zal gemakkelijk doen).

Dat gezegd hebbende, als u de conversie uitvoert en vervolgens de geconverteerde UTC-datum doorgeeft (de datum die wordt verkregen door de ToUniversalTime methode, niet door te converteren naar een string) naar de opgeslagen procedure.

En wanneer u de waarde terugkrijgt, belt u de ToLocalTime methode om de tijd in de lokale tijdzone te krijgen.



  1. Kunnen we primaire sleutelwaarden van een tabel bijwerken?

  2. AlwaysOn-beschikbaarheidsgroepen configureren op SQL Server

  3. Hoe verbreek je alle huidige verbindingen met een SQL Server 2005-database?

  4. Hoe te ontsnappen aan een string terwijl het patroon overeenkomt in PostgreSQL