2013-06-06 112 views
0

我正在研究C#控制檯應用程序項目。試圖將一個DateTime值插入到SQL Server 2008中,這很好。如果我的代碼失敗,我想將默認DateTime插入到數據庫中的表中。無法將C#的默認DateTime插入到SQL Server 2008中

當我嘗試插入時出現錯誤。

SqlTypeException是未處理:
SQLDATETIME溢出。必須介於1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之間。

下面我粘貼了具體的代碼。

try 
{ 
    ... 
    return DateTime.Now; 
} 

catch (WebException ex) 
{ 
    ... 
    return default(DateTime); 
} 

代碼我用來插入在日誌表的詳細信息:

connection.Open(); 
for (int i = 0; i < LogList.Count; i++) 
    { 
     string aprocessLogQuery = "INSERT INTO PROCESS_LOGS VALUES (@fileId, @startTime, @endTime, @transferredTime)"; 
     command = new SqlCommand(aprocessLogQuery, connection); 
     command.Parameters.Add("fileId", SqlDbType.Int).Value = LogList[i].fileId; 
     command.Parameters.Add("startTime", SqlDbType.DateTime).Value = LogList[i].fileGeneration_StartDateTime; 
     command.Parameters.Add("endTime", SqlDbType.DateTime).Value = LogList[i].fileGeneration_EndDateTime; 
     command.Parameters.Add("transferredTime", SqlDbType.DateTime).Value = LogList[i].fileTransferred_DateTime; 
     dataReader.Close(); 
     dataReader = command.ExecuteReader(); 
    } 
connection.Close(); 

DateTime的默認值是01/01/0001 12:00:00 AM,因此它無法正常工作。任何人都可以請建議備用工作解決方案?

由於

+6

你應該使用[datetime2數據類型](http://stackoverflow.com/questions/1334143/sql-server-datetime2-vs-datetime) – V4Vendetta

+0

它w應該使用SqlParameter而不是字符串。每當我看到一個字符串查詢,我看到SQL注入的風險... –

+0

看看[這個問題](http://stackoverflow.com/questions/16692647/why-when-i-insert-a-datetime -null -i-have-0001-01-01-in-sql-server/16693888#16693888):它表示在數據庫中插入'null' datetime會給出默認值。 – Spaceman

回答

3

在數據庫中,日期不詳表示與NULL值。您可以插入,像:

command.Parameters.AddWithValue("@startTime", DBNull.Value); 

(據我所知,它需要與@前綴的參數。)

+2

「@」前綴在那裏是可選的。 –

3

另一種替代方案是可以解決由於生成擴展方法看起來像如下:的return default(DateTime)

public static class DateTimeExtension 
{ 
    public static DateTime DefaultSqlDateTime(this DateTime dateTime) 
    { 
     return new DateTime(1753, 1, 1, 12, 0, 0); 
    } 
} 

,而是可以使用可變日期時間return dateTime.DefaultSqlDateTime;

編輯: 如何使用擴展方法:

如:return default(DateTime).GetDefaultSqlDateTime();

DateTime dateTime = ... 
return dateTime.GetDefaultSqlDateTime(); 
+0

謝謝。但'返回DateTime.DefaultSqlDateTime'不起作用。你能解釋一下嗎? – Praveen

+0

@ user1671639啊,我看到你想知道如何使用DefaultSqlDateTime擴展方法。請參閱下面的編輯部分。 –

+0

我仍然無法通過它。以下錯誤'擴展方法必須在非泛型靜態類中定義' – Praveen

0

我用我的工具這一功能,而不是常規的TryParse

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate) 
    { 
     bool valid = false; 
     tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; 
     System.Data.SqlTypes.SqlDateTime sdt; 
     if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate)) 
     { 
      try 
      { 
       sdt = new System.Data.SqlTypes.SqlDateTime(tryDate); 
       valid = true; 
      } 
      catch (System.Data.SqlTypes.SqlTypeException ex) 
      { 


      } 
     } 

     ret 
相關問題