UPDATE查询DateTime溢出

本文关键字:溢出 DateTime 查询 UPDATE | 更新日期: 2023-09-27 18:27:54

我使用SQL Server 2012和VS 2012。我有一张表,上面有以下数据:

TagID      SessionID       ScanningTime
 int       nvarchar          datetime
---------------------------------------
4820427      Test1    2013-08-16 14:20:17.447

我创建了一个UPDATE查询,将DGV中所做的任何更改(添加的任何记录或编辑的现有记录)保存回SQL数据库。

例如,我将添加一个新记录并编辑现有记录,使其看起来像这样:

TagID      SessionID       ScanningTime
 int       nvarchar          datetime
---------------------------------------
4820000     Test1     2013-08-16 14:20:17.447
3242341     Test1     2013-08-16 14:20:17.447

点击按钮更新数据库:

private void UpdateBtn_Click(object sender, EventArgs e)
        {
            DataTable queryResult = new DataTable();
            foreach (DataGridViewRow  row in dataGridView1.Rows)
            {
                int tagID = Convert.ToInt32(row.Cells["TagID"].Value);
                string sessionID = Convert.ToString(row.Cells["SessionID"].Value);
                DateTime ScanningTime = Convert.ToDateTime(row.Cells["ScanningTime"].Value);
            string ConnStr = "Data Source=DUZY;Initial Catalog=AutoRegSQL;Integrated Security=True";
            SqlConnection MyConn = new SqlConnection(ConnStr);
            MyConn.Open();
            //SQL query that returns todays sessions for the given roomID
            string query = @"UPDATE Attendance" +
               " SET TagID= @tagNo, SessionID= @sessionNo, ScanningTime= @scantime ";
            SqlCommand command = new SqlCommand(query, MyConn);
            command.Parameters.Add("tagNo", SqlDbType.Int).Value =  tagID;
            command.Parameters.Add("sessionNo", SqlDbType.VarChar).Value = sessionID;
            command.Parameters.Add("scantime", SqlDbType.DateTime).Value = ScanningTime;
            SqlDataAdapter adapter = new SqlDataAdapter(command);

            adapter.Fill(queryResult);

            MyConn.Close();
            }
        }

当我点击按钮保存更改时,我收到一个错误:

An unhandled exception of type 'System.Data.SqlTypes.SqlTypeException' occurred in System.Data.dll
Additional information: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

编辑

回顾我的SSMS,在尝试更新考勤表后,考勤表的内容发生了变化。原始记录被手动添加的记录替换(尽管有错误)。

UPDATE查询执行后的考勤表:

    TagID      SessionID       ScanningTime
     int       nvarchar          datetime
    ---------------------------------------
    5453453     Test1   2013-08-16 14:20:00.000

UPDATE查询DateTime溢出

在这种情况下,问题很可能是SQL Server对日期格式的假设不正确。

当你把DateTime添加到参数中时,试着这样转换它:

ScanningTime.ToString("yyyy-MM-dd HH:mm:ss");

如果这有帮助,请告诉我。

尝试像SQL中的通用文字一样格式化日期时间,即YYYYMMDD hh:mm:ss[.mmm],因为这种格式与区域性无关

或者,你甚至可以试试这个:

string myDatetime = ScanningTime .ToString("yyyy-MM-ddTHH:mm:ss.fff");

并且在UPDATE语句中传递新变量myDateTime

首先需要检查的一件事是,ScanningTime是否为NULL,因为SQL表中的datetime字段需要一些值,而对于datetime数据类型,最小值为1/1/1753 12:00:00,最大值为12/31/9999 11:59:59