2013-03-24 22 views
0

請看看下面的數據庫結構:DateValue和SQL DATETIME - 30/12/1899轉換爲01/01/01?

CREATE TABLE TestStartDate (PersonID int, StartDate datetime NOT NULL) 
INSERT INTO TestStartDate VALUES(1,'1899-12-30') 

和代碼如下:

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
     Dim objCommand As SqlCommand, objCommand2 As SqlCommand 
     Dim objCon As SqlConnection 
     Try 
      objCommand = New SqlCommand 
      Using objCommand 
       Dim strConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=true" 
       objCon = New SqlConnection 
       Using(objCon) 
        objCon.ConnectionString = strConString 
        objCon.Open() 
        objCommand.Connection = objCon 
        objCommand.CommandText = "select startdate from TestStartDate " 
        Dim objDR As SqlDataReader = objCommand.ExecuteReader 
        If objDR.HasRows Then 
         objDR.Read() 
         Using objCon 
          objCommand2 = New SqlCommand 
          Using objCommand2 
           objCommand2.Connection = objCon 
           objCommand2.CommandText = "INSERT INTO TestStartDate (StartDate) VALUES (@StartDate)" 
           objCommand2.Parameters.AddWithValue("@StartDate", DateValue(objDR("StartDate"))) 'line 24 
           'objCommand2.Parameters.AddWithValue("@StartDate", objDR("StartDate")) 'line 25 
           objCommand2.ExecuteNonQuery() 'Line 26 
           Dim date1 As Date = objDR("startdate") 
          End Using 
         End Using 
        End If 
       End Using 
      End Using 
     Catch ex As Exception 
      Throw 
     Finally 

     End Try 
    End Sub 

的代碼拋出上線26異常(第26行被註釋):

SqlDateTime溢出。必須是1753年1月1日12:00:00 AM和12/31/9999之間下午11:59:59

我可以通過註釋掉線24,並取消註釋行25.爲什麼DATEVALUE原因解決此這個例外?

我已看過以下網頁:http://msdn.microsoft.com/en-us/library/6d6k22a5%28v=vs.80%29.aspx。這表明DATEVALUE可能會將30/12/1899轉換爲01/01/01(01/01/01在SQL Server中不是可接受的值)?如果是這種情況,那麼爲什麼30/12/1899轉換爲01/01/01?

+0

兩種可能性:由'objDR'產生的日期時間值超出範圍,或在'DateValue'轉換期間變爲無效。 DateValue(objDR(「StartDate」))產生什麼值?你有沒有嘗試通過編寫'objDR.GetDateTime(objDR.GetOrdinal(「StartDate」))'來替換'DateValue'函數? – stakx 2013-03-24 13:06:28

+0

@stakx,我編輯了這個問題,請再看一下。 – w0051977 2013-03-24 13:12:03

+0

用'1899年日期功能'檢查這個鏈接的一些歷史記錄:http://stackoverflow.com/questions/3963617/why-is-1899-12-30-the-zero-date-in-access-sql -server-instead-of-12-31 – 2013-03-24 13:20:16

回答

0
Dim date1 As Date = objDR("StartDate") 

鑑於此行的你的代碼,讓我們假設objDR("StartDate")返回DateTime值。

….CommandText = "INSERT INTO TestStartDate (StartDate) VALUES (@StartDate)" 
….Parameters.AddWithValue("@StartDate", DateValue(objDR("StartDate"))) 
….ExecuteNonQuery() 

DateValue function執行從StringDateTime的轉化率。但是,您正在向函數(objDR("StartDate"),請參見上面)傳遞DateTime值,強制進行另一次轉換。

因此,該行代碼採用DateTime值,將其隱式轉換爲String,然後明確解析該字符串以生成DateTime值。有兩種可能的文化依賴轉換可能會產生意想不到的結果。

讓我們注意到,這兩個轉換是完全沒有必要的。

….CommandText = "INSERT INTO TestStartDate (StartDate) VALUES (@StartDate)" 
….Parameters.AddWithValue("@StartDate", objDR("StartDate")) 
….ExecuteNonQuery() 

在這個版本中,沒有任何轉換,從DateTimeStringDateTime。而且,由於它有效(根據你所說的),我的假設是所有這些轉換都會出現問題。

+0

謝謝。我想我需要找出轉換如何導致這個問題或等待回答者解釋。 – w0051977 2013-03-24 13:53:27

+0

@ w0051977:這些轉換可能取決於您的文化/日曆設置。所以我建議你** 1。**閱讀DateValue函數的MSDN文檔,然後** 2。**取得您的DateTime樣本值,將其提供給DateValue函數,並查看函數的返回值。這可能會對解釋您遇到的問題有很大的幫助。 – stakx 2013-03-24 13:56:20