Dapper SqlDateTime overflow usando GETDATE () en SQL Server

asp.net-mvc-3 dapper sql sql-server

Pregunta

Tengo el siguiente código que obtiene la entrada de un formulario y llama a un procedimiento almacenado para almacenarlo en una base de datos.

 [HttpPost]
 public ActionResult Index(GuestMessage model)
 {
        if (ModelState.IsValid)
        { 
            using(IDbConnection conn = DatabaseAcess.OpenConnection())
            {
                const string storedProcedure = "dbo.InsertMessage";
                conn.Execute(storedProcedure, new GuestMessage { Name = model.Name, Email = model.Email, Message = model.Message }, null, null, CommandType.StoredProcedure);

                return View("ThankYou");
            }
         }
        return View();
}

Hay tres campos, Name , E-mail y Message que el usuario debe completar. En la base de datos, almaceno los datos que ingresa el usuario, desde estos tres campos, y la hora de la entrada usando una función almacenada llamada dbo.Insert Message.

BEGIN
  BEGIN TRAN

  SET NOCOUNT ON;

  DECLARE @GuestID int;
  INSERT INTO Guest(Name, Email) VALUES (@Name, @Email);
  SELECT @GuestID = scope_identity();

  INSERT INTO Message (EntryDate, GuestID, Message, Status) 
  VALUES (GETDATE(), @GuestID, @Message, 2);

  COMMIT TRAN
END

Tenga en cuenta que no paso la fecha y la hora de entrada como un parámetro de entrada al procedimiento almacenado, ya que no es necesario. Uso la función incorporada GETDATE() en SQL Server para determinar la hora en que un usuario ingresó un mensaje.

Sin embargo, cada vez que intento ingresar un mensaje, aparece el siguiente error:

Desbordamiento de SqlDateTime. Debe ser entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM

Respuesta aceptada

Sugeriría el siguiente cambio:

conn.Execute(storedProcedure,
    new { Name = model.Name, Email = model.Email, Message = model.Message },
    commandType: CommandType.StoredProcedure);

El único cambio real es que he cambiado new GuestMessage { ... } por new { ... } . Lo que sospecho que está sucediendo es que su tipo GuestMessage tiene propiedades adicionales que no son necesarias , pero que está enviando como parámetros. Un DateTime queda en su valor predeterminado es "00: 00: 00.0000000, 1 de enero, 0001". Cambiando a solo new { ... } , hemos limitado explícitamente los miembros que estamos enviando a Name , Email y Message , porque esas son las únicas cosas definidas .

Nota: al usar texto sin formato, dapper utiliza algo de vudú para tratar de ver qué nombres de parámetros se usan realmente en el SQL, y no envía nada que sepa que no está referenciado en el SQL; sin embargo, no puede hacer esto con un procedimiento almacenado.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow