Como você está configurando o
SqlParameter
? Você deve definir o SqlDbType
propriedade para SqlDbType.DateTime
e, em seguida, passe o DateTime
diretamente para o parâmetro (NÃO converta para uma string, você está pedindo um monte de problemas então). Você deve ser capaz de obter o valor no banco de dados. Se não, aqui está um exemplo muito simples de como fazer isso:
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();
}
}
}
Acho que parte do problema aqui é que você está preocupado que o fato de a hora estar em UTC não esteja sendo transmitido ao SQL Server. Para esse fim, você não deveria, porque o SQL Server não sabe que um determinado horário está em uma determinada localidade/fuso horário.
Se você deseja armazenar o valor UTC, converta-o para UTC antes de passá-lo para o SQL Server (a menos que seu servidor tenha o mesmo fuso horário que o código do cliente que gera o
DateTime
, e mesmo assim, isso é um risco, IMO). O SQL Server armazenará esse valor e, quando você recuperá-lo, se quiser exibi-lo na hora local, terá que fazer isso sozinho (o que o DateTime
struct fará facilmente). Tudo isso dito, se você realizar a conversão e depois passar a data UTC convertida (a data que é obtida chamando o método
ToUniversalTime
método, não convertendo em uma string) para o procedimento armazenado. E quando você recuperar o valor, chame o
ToLocalTime
método para obter a hora no fuso horário local.