首页 文章

Dapper SqlDateTime在SQL Server中使用GETDATE()溢出

提问于
浏览
2

我有以下代码从表单获取输入并调用存储过程将其存储在数据库中 .

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

有三个字段, NameE-mailMessage 必须由用户填写 . 在数据库中,我存储用户从这三个字段输入的数据,以及使用名为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

请注意,我没有将输入日期和时间作为输入参数传递给存储过程,因为不需要这样做 . 我使用SQL Server中的内置函数 GETDATE() 来确定用户输入消息的时间 .

但是,每当我尝试输入消息时,我都会收到以下错误:

SqlDateTime溢出 . 必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间

1 回答

  • 1

    我建议进行以下更改:

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

    唯一的实际变化是我已经为 new { ... } 交换了 new GuestMessage { ... } . 我怀疑发生的是你的 GuestMessage 类型具有不需要的附加属性,但它作为参数发送 . DateTime 保留其默认值为"00:00:00.0000000, January 1, 0001" . 通过交换到 new { ... } ,我们明确地将我们发送的成员限制为 NameEmailMessage ,因为这些是唯一定义的内容 .

    注意:当使用纯文本时,dapper会使用一些voodoo来尝试查看SQL中实际使用的参数名称,并且它不会发送任何在SQL中未引用 knows 的内容 - 但是,它不能做这与存储过程 .

相关问题