2012-06-12 42 views
0

我正在導入一些Excel文件到SQL Server使用C#控制檯應用程序與SqlBulkcopy和導入日期時間值時接收以下異常。日期時間值在SQL批量插入

例外: 當我們要進行批量複製時,會出現此異常,其中一列或多列具有日期時間數據類型。我認爲它與日期格式有關,下面是錯誤細節。

「數據源中String類型的給定值不能轉換爲指定目標列的類型datetime」。

代碼片段

sExcelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFilePath + ";Extended Properties=" + "\"Excel 12.0;HDR=No;IMEX=1;\""; 
OleDbConnection OleDbConn = new OleDbConnection(sExcelConnectionString); 
        OleDbTransaction tran; 
        OleDbCommand OleDbCmd = new OleDbCommand(myExcelDataQuery, OleDbConn); 
        OleDbConn.Open(); 
        OleDbDataReader dr = OleDbCmd.ExecuteReader(); 


       if (dr.HasRows && dr.FieldCount > 1) 
       { 
        //DataTable dt = readReader(dr); 
        try 
        { 

         string sSqlConnectionString = connectionString.ToString(); 
         string sClearSQL = "DELETE FROM " + sSQLTable; 
         SqlConnection SqlConn = new SqlConnection(sSqlConnectionString); 
         SqlCommand SqlCmd = new SqlCommand(sClearSQL, SqlConn); 

         SqlConn.Open(); 
         //SqlCmd.ExecuteNonQuery(); 
         SqlConn.Close(); 
         SqlBulkCopy bulkCopy = new SqlBulkCopy(sSqlConnectionString); 
         bulkCopy.DestinationTableName = sSQLTable; 
         bulkCopy.BulkCopyTimeout = 0; 
         while (dr.Read()) 
         { 

          bulkCopy.WriteToServer(dr); 
          imported = true; 

         } 
         OleDbConn.Close(); 
         if (valToField.ToString() != "") 
         { 
          sClearSQL = "DELETE FROM " + sSQLTable + " where " + valToField + "='" + valToRemove.ToString() + "'"; 
          SqlCmd = new SqlCommand(sClearSQL, SqlConn); 
          SqlConn.Open(); 
          SqlCmd.ExecuteNonQuery(); 
         } 
         SqlConn.Close(); 

        } 
        catch (Exception ex) 
        { 

         LogMessageToFile("Error While Inserting Data from : " + excelFilePath.ToString() + " to table : " + dbtable.ToString() + ex.Message.ToString()); 

        } 
       } 

請建議的解決方案

感謝

+0

這是您自己的自定義異常消息嗎?一些代碼和真​​正的例外會很高興在板上 – V4Vendetta

+0

更新了問題 –

+3

您需要理智檢查您的文件。確保日期格式爲sql友好格式。如今天的「20120612」。如果你不能確保日期格式是正確的,那麼你需要兩個階段;將該數據導入到保存表中的'VARCHAR()'字段,然後檢查數據並將其複製到最終的目標表中 - 在複製過程中進行轉換。通過這種方式,您也可以選擇記錄未通過完整性檢查的記錄。 – MatBailie

回答

2

簡單的答案是,以您的Excel日期轉換爲使用= TEXT(字符串A1,「DD MMMM YYYY HH: mm:ss「)函數,其中a1是對日期單元格的引用。

注意月份的四個m;最好使用完整的月份名稱,並讓SQL服務器處理日期轉換,以防日期排序衝突。

按照下面的評論,這將在不同文化&語言= TEXT工作(A1, 「YYYY-MM-DDTHH:MM:SS」)

+0

它要求使用完整的月份名稱的麻煩,因爲它假定SQL Server和您的.NET應用程序都使用相同的文化。相反,使用規範文化不敏感的格式,如yyyy-MM-dd HH:mm:ss – Joe

+0

那裏有趣的點;取決於你的情況,但更有可能的是,你建議的完整格式可能會得到月份和日期錯誤的方式取決於服務器上的設置。我們之前在配置錯誤的服務器上遇到了這個問題,因此我們只使用英文 –

+0

否,這種格式是明確的,不受SQL Server的「SET DATEFORMAT」或「SET LANGUAGE」的影響。還有其他明確的格式可以很好地工作,例如, ISO 8601 yyyy-MM-ddTHH:mm:ss – Joe

0

「String類型的給定值從數據源無法轉換爲指定目標列的日期時間類型「。

錯誤消息是顯式的:有一列從源返回爲您試圖插入到DateTime目標列中的字符串。

1

不要重新發明輪子。使用SSIS,是這份工作的正確工具。創建一個從Excel source讀取的流,做任何轉換都是合適的,然後使用快速加載將其保存爲SQL Server。你想要做的是更慢,更少維護,更少維修,更改時缺乏適應性,最終不正確(如你的錯誤所示)。正確的導入將不得不正確驗證和轉換每條記錄(例如,使用Datetime.TryParse並將輸出更改爲適當的DateTime類型)。

+0

如果你倒下了,解釋爲什麼 –