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
在这种情况下,问题很可能是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
。