2017-01-26 2 views
0

タイトルのように、私はインポートできるプログラム(および将来のプログラムで使用できる一般的なメソッド)を作成しようとしていますExcelシートのすべての情報をSQLのテーブルに格納します。C#でExcelからSQLにシートを読み込むときに、DateTime列の時間が失われる

メソッドが実行され、すべてのデータがSQLテーブルに格納されます。このテーブルは、この時点までに必要なすべての機能を備えています。しかし、実行する必要がある新しいレポートでは、ExcelのDATETIME列でTIMEが失われることがわかりました。

たとえば、Excelのセルの値が7/26/2016 08:54:32の場合、代わりに7/26/2016 00:00:00の値がSQLテーブルに保持されます。 SQL Server Management Studioに含まれている手動インポート/エクスポートウィザードを使用すると、datetimeが正しくインポートされ、両方の値が保持されます。

static bool ImportDataFromExcel(string excelFilePath, string excelSheet, string sqlTable) 
    { 
     //make sure the sheet name is correct 
     string myExcelDataQuery = "select * from [" + excelSheet + "]"; 

     if (File.Exists(excelFilePath)) 
     { 
      try 
      { 
       //create our connection strings 
       string sExcelConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=No;IMEX=1;'", excelFilePath); 
       string sSqlConnectionString = "Data Source=Server;Initial Catalog=Database;Integrated Security=true"; 

       //execute query to erase data from destination table 
       string sClearSql = "delete from " + sqlTable; 
       SqlConnection sqlConn = new SqlConnection(sSqlConnectionString); 
       SqlCommand sqlCMD = new SqlCommand(sClearSql, sqlConn); 
       sqlConn.Open(); 
       sqlCMD.CommandTimeout = 80000; 
       sqlCMD.ExecuteNonQuery(); 
       sqlConn.Close(); 

       //series of commands to bulk copy data from the excel file into our sql table 
       OleDbConnection oleDbConn = new OleDbConnection(sExcelConnectionString); 
       OleDbCommand oleDbCmd = new OleDbCommand(myExcelDataQuery, oleDbConn); 
       oleDbConn.Open(); 
       oleDbCmd.CommandTimeout = 60000; 
       OleDbDataReader dr = oleDbCmd.ExecuteReader(); 
       SqlBulkCopy bulkCopy = new SqlBulkCopy(sSqlConnectionString); 
       bulkCopy.BulkCopyTimeout = 60000; 
       bulkCopy.DestinationTableName = sqlTable; 
       while (dr.Read()) 
       { 
        bulkCopy.WriteToServer(dr); 
       } 
       dr.Close(); 
       oleDbConn.Close(); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
       return false; 
      } 
     } 
     return true; 
    } 

あなたがたのうち、Excelからテーブルをインポートするために使用するには、この作業を取得する方法の、または別の方法の任意のアイデアを持っていますか:ここで

は、私が使用していますメソッドのコードですプログラムでC#でSQLに?

+0

テーブルであなたの列の型は何ですか?日時/日付? –

+0

DateTime、手動インポート/エクスポートウィザードを使用してデータをインポートすると、日付と時刻の両方の値が正しく維持されます –

+0

columnmappings 'bulkCopy.ColumnMappings.Add(" Excelfield "、" DBfield ");' –

答えて

0

SQL Serverが完全なDateTime形式を正しく取得していない可能性があります。

  while (dr.Read()) 
      { 
       bulkCopy.WriteToServer(dr); 
      } 

...実際に書き込まれるフォーマットを調べるにはどうすればいいですか?

私はこれは価値があるかどうあまりにもわからないんだけど、TSQL日時タイプを使用して、タイプがこの形式でミリ秒が含まれています

WHERE OperationDate >= '2016-03-01 00:00:00.000' 
and OperationDate NOT BETWEEN CONVERT(datetime,'2016-01-13') AND CONVERT(datetime,'2016-01-13 23:59:59:999') 

あなたのリーダーでたぶんいくつかの特別な扱い?

0

私は、SLQサーバー側でデータ型が正しくないと推測しています。または...データがExcelで正しくフォーマットされていません。両方が正しいことを確認し、下記のようなものを試してみてください。ここから

string excelConnectionString = @"Provider=Microsoft 
.Jet.OLEDB.4.0;Data Source=Book1.xls;Extended 
Properties=""Excel 8.0;HDR=YES;"""; 
// Create Connection to Excel Workbook 

We can Import excel to sql server like this 

using (OleDbConnection connection = 
      new OleDbConnection(excelConnectionString)){ 

OleDbCommand command = new OleDbCommand 
      ("Select ID,Data FROM [Data$]", connection); 

connection.Open(); 


`// Create DbDataReader to Data Worksheet ` 
using (DbDataReader dr = command.ExecuteReader()) 
{ 
    // SQL Server Connection String 
    string sqlConnectionString = "Data Source=.; 
     Initial Catalog=Test;Integrated Security=True"; 


    // Bulk Copy to SQL Server 
    using (SqlBulkCopy bulkCopy = 
       new SqlBulkCopy(sqlConnectionString)) 
    { 
     bulkCopy.DestinationTableName = "ExcelData"; 
     bulkCopy.WriteToServer(dr); 
    } 

Import Excel file into Microsoft SQL Server using C#

関連する問題