2010-08-14 46 views
0

我試圖做到以下幾點:ADO.NET插入最小值到SQL Server 2008的日期欄崩潰

using (var tx = sqlConnection.BeginTransaction()) 
{ 
var command = sqlConnection.CreateCommand(); 
command.Transaction = tx; 
command.CommandText = "INSERT INTO TryDate([MyDate]) VALUES(@p0)"; 
var dateParam = command.CreateParameter(); 
dateParam.ParameterName = "@p0"; 
dateParam.DbType = DbType.Date; 
dateParam.Value = DateTime.MinValue.Date; 
command.Parameters.Add(dateParam); 
command.ExecuteNonQuery(); 
tx.Commit(); 
} 

所在的表有一個SQL Server 2008中日期列。我可以通過SQL管理工作室將'01/01/0001'值插入。

如果我在ExecuteNonQuery上運行上述命令,我得到一個「SqlDateTime溢出,必須在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之間。」例外。

這是爲什麼? SQL Server日期字段確實接受01/01/0001。

+0

嘗試'dateParam.SqlDbType = SqlDbType.Date;'而不是'dateParam.DbType = DbType.Date;' - 定義並使用'SqlDbType' - 肯定有效 – 2010-08-14 19:28:33

回答

1

這工作...

var command = sqlConnection.CreateCommand(); 
command.Transaction = tx; 
command.CommandText = "INSERT INTO TryDate([MyDate]) VALUES(@p0)"; 
SqlParameter dateParam = new SqlParameter(); 
dateParam.ParameterName = "@p0"; 
dateParam.SqlDbType = SqlDbType.Date; 
dateParam.Value = DateTime.MinValue.Date; 
command.Parameters.Add(dateParam); 
command.ExecuteNonQuery(); 
+1

反映SqlParameter代碼表明有一個明確的區別DbType.Date和SqlDbType.Date之間 - 我沒有找到框架中導致錯誤的特定行代碼 - 但是,使用SqlDbType.Date應該可以解決這個問題。 – 2010-08-14 12:53:32

+0

謝謝Will A.我懷疑這將是答案,但實際上並沒有得到爲什麼「通用」DbType Date會因SQL Server錯誤而失敗。特別是因爲還有一個DateTime DbType,我希望它與原始的SQL DateTime類型匹配,這個類型一直有這個限制。 對我來說看起來像一個.NET bug。 – GrahamB 2010-08-15 00:41:00

0

由於錯誤說 必須是1753年1月1日12:00:00 AM和12/31/9999下午11:59:59之間。

SQLServer DateTime列具有與CLR中的dateTime變量不同的最小值和最大值。

您可能希望將邏輯放入程序中,以防止數據庫超出SQLServer範圍的日期時間。

+0

我最初認爲這是它,但他使用了更新的'DATE'數據類型。 'DATE'和'DATETIME2'匹配CLR允許的值範圍。他的問題似乎出現在ADO.NET調用中,而不是SQL Server中。他的代碼必須在某處推斷'DATETIME'而不是'DATE'。 – mattmc3 2010-08-14 12:41:19

+0

Nope - 使用DbType.Date而不是SqlDbType.Date破壞代碼並限制範圍。 – 2010-08-14 12:43:22