SQL Server中的DateTime问题

我正在尝试对MS SQL Server中已设置的数据库执行INSERT,数据库服务器位于共享主机(godaddy)中。

而我想要实现的是将文章存储到数据库中,但每次我发布或获取文章的预览时服务器都会抛出我

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.] System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam) +5635 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1379 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41 System.Data.Common.DbCommand.ExecuteReader() +12 System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +1306 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +118 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +342 System.Data.Linq.StandardChangeDirector.DynamicInsert(TrackedObject item) +145 System.Data.Linq.StandardChangeDirector.Insert(TrackedObject item) +215 System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) +378 System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +372 System.Data.Linq.DataContext.SubmitChanges() +23 sgc.Servicio.CrearServicio.InsertDB(Object sender, EventArgs e) in CrearArticulo.aspx.cs:114 System.EventHandler.Invoke(Object sender, EventArgs e) +0 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9553178 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9642898 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724 

我在共享主机中有一个Datetime类型字段,它应该采用文章的日期,顺便说一下它不会在其他文章表上抛出这个错误。 就在这个,也许是一个错字或什么?

这是我的代码(抛出错误的代码):

 public partial class CrearServicio : System.Web.UI.Page { string tpCont = "1"; int estatus = 1; bool withResponse = true; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { TextBox1.Attributes.Add("onKeyDown", "textCounter(this, 'counter1', 500)"); TextBox1.Attributes.Add("onKeyUp", "textCounter(this, 'counter1', 500)"); datetime.Text = DateTime.Now.ToString("yyyyMMddHHmmss"); if (Request.QueryString["tpCont"] != null) { tpCont = Request.QueryString["tpCont"]; volver.HRef = "elegir.aspx?tpCont=" + tpCont; volver1.HRef = "elegir.aspx?tpCont=" + tpCont; } ConexionServiciosDataContext db = new ConexionServiciosDataContext(); tpContinpt.Text = tpCont; int role = kernel.getUserRole(User.Identity.Name); int tipoUsuario = role; if (tipoUsuario == 1 || tipoUsuario == 2) { mainButton.Visible = true; saveButton.Visible = true; displayButton.Visible = true; } } } protected void SaveDBAndDisplay(object sender, EventArgs e) { withResponse = false; SaveDB(sender, e); } protected void SaveDB(object sender, EventArgs e) { estatus = 2; InsertDB(sender, e); } protected void InsertDB(object sender, EventArgs e) { tpCont = tpContinpt.Text; if (TextArea1.Text.Length > 0) { ConexionServiciosDataContext db = new ConexionServiciosDataContext(); Servicios columna = new Servicios(); columna.Título = TextBox1.Text.ToString(); string line = TransformarString(TextArea1.Text.ToString()); columna.Contenido = line.ToString(); string[] IDsTitlesLocations = { }; db.Servicios.InsertOnSubmit(columna); db.SubmitChanges(); } } } 

对不起,如果我写得太多但我只是坚持这个,也许我应该在服务器上设置日期时间格式?

有人可以对此有所了解吗?

我假设Servicios具有未设置的DateTime属性。

DateTime不可为空,当它们未设置时,它们默认为{1/1/0001 12:00:00 AM}

在调用db.SubmitChanges() ,您尝试将一个值插入到DateTime列中,该值是SQL SERVER支持的较低值,如exception中所示。

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

尝试DateTime.Now ,如果是textfeild DateTime.Now.ToString(); 希望这项工作。

它在几乎相同的情况下工作正常。

1/1/0001 12:00:00 AM等是sqlServer的默认值,在上面的注释中,如果删除方法后,它什么也不做就意味着它没有更新引用或类似的东西。

确保删除要删除的内容,如果不删除,则通过更改属性并刷新+检查来强制执行

请注意,MS SQL Server的DateTime和C# DateTime具有不同的 MinValues。

虽然MS SQL DateTime仅在{1/1/1753 12:00:00 AM}开始,但C#DateTime以{1/1/0001 12:00:00 AM}

我想到了3种方法:

  1. 在代码中确保要保存的对象在保存之前设置了有效的DateTime值。 其他海报已经为此提出了一些建议。

  2. 将默认值添加到数据库端的列。 对我来说,这似乎是最简单,最干净的方法。 您既不需要更改数据类型也不会影响您的代码,您将确保不会(或可能)保存无效日期。

  3. 如果在开发阶段可以实现,则可以将列的数据类型更改为DateTime2 ,这允许以{1/1/0001 12:00:00 AM}开头的日期。 这里有 MSDN文档。

据我说,它将如下:

 datetime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 

我不明白你为什么要把datetime转换成String?

  datetime.Text = DateTime.Now.ToString("yyyyMMddHHmmss"); 

如果你必须在数据库中插入日期时间,那么只需将该datetime变量传递给insert命令。

 DateTime dt = new DateTime(); dt = DateTime.Now.Date; 

当您将其插入DB时,DB会将其转换为适当的日期时间格式。 就试一试吧。