Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando DateTime em um SqlParameter para procedimento armazenado, erro de formato


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.