Jak konfigurujesz SqlParameter
? ? Powinieneś ustawić SqlDbType
właściwość SqlDbType.DateTime
a następnie przekaż DateTime
bezpośrednio do parametru (NIE konwertuj na ciąg, wtedy pytasz o kilka problemów).
Powinieneś być w stanie pobrać wartość do DB. Jeśli nie, oto bardzo prosty przykład, jak to zrobić:
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();
}
}
}
Myślę, że częścią problemu jest to, że martwisz się, że fakt, iż czas jest w UTC, nie jest przekazywany do SQL Server. W tym celu nie powinieneś, ponieważ SQL Server nie wie, że określony czas jest w określonej lokalizacji/strefie czasowej.
Jeśli chcesz przechowywać wartość UTC, przekonwertuj ją na UTC przed przekazaniem jej do SQL Server (chyba że Twój serwer ma tę samą strefę czasową co kod klienta generujący DateTime
, a nawet wtedy jest to ryzyko, IMO). SQL Server przechowa tę wartość, a gdy ją odzyskasz, jeśli chcesz wyświetlić ją w czasie lokalnym, musisz zrobić to sam (co oznacza DateTime
struct z łatwością to zrobi).
Biorąc to wszystko pod uwagę, jeśli wykonasz konwersję, a następnie przekażesz przekonwertowaną datę UTC (data uzyskana przez wywołanie funkcji ToUniversalTime
metody, a nie przez konwersję na ciąg) do procedury składowanej.
A kiedy odzyskasz wartość, wywołaj ToLocalTime
metoda, aby uzyskać czas w lokalnej strefie czasowej.