2017-02-27 10 views
2

このメソッドを使用してSQLにデータをアップロードしています。C#windowsフォームアプリケーションを使用してExcel(.CSV)ファイルからSQLにデータをアップロード

private void button5_Click(object sender, EventArgs e) 
{ 
    string filepath = textBox2.Text; 

    string connectionString_i = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", Path.GetDirectoryName(filepath)); 

    using (OleDbConnection connection_i = new OleDbConnection(connectionString_i)) 
    { 
     connection_i.Open(); 

     OleDbCommand command = new OleDbCommand ("Select * FROM [" + Path.GetFileName(filepath) +"]", connection_i); 

     command.CommandTimeout = 180; 

     using (OleDbDataReader dr = command.ExecuteReader()) 
     { 
      string sqlConnectionString = MyConString; 

      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) 
      { 
       SqlBulkCopy bulkInsert = new SqlBulkCopy(sqlConnectionString); 
       bulkInsert.BulkCopyTimeout = 180; 
       bulkInsert.DestinationTableName = "Table_Name"; 
       bulkInsert.WriteToServer(dr); 

       MessageBox.Show("Upload Successful!"); 
      } 
     } 

     connection_i.Close(); 
    } 
} 

Excelシートは、.CSVという形式で約1,048,313エントリあります。その一括コピー方法は、約36000から60000のエントリで動作しています。 Excelから最初の30000エントリを選択してSQL Serverテーブルにアップロードし、次に30000行の次のチャンクを選択してSQL Serverにアップロードするなどの方法があるかどうかを尋ねますが保存されています。

+0

うん.. 'csv'は非常にシンプルな形式です。ファイルリーダーでファイルを操作する方がはるかに簡単ですか? (毎回次の30000行を読むだけです) – ymz

+0

新しいテーブルを毎回作成しなければならないのですが、既存のテーブルを更新する必要があります。もし何とか接続が解除されたり、何らかのエラーが発生した場合は、すべての現在の変更も戻って.. ..その問題。 –

答えて

1
  1. ターゲットテーブルに挿入する必要があるcsvファイルの値を格納するデータテーブルを作成します。データテーブルの各列は、csvファイルのデータ列に対応します。
  2. データ型と長さを含むデータテーブルと一致するように、SQL Server上にカスタムデータ型(テーブル値)を作成します。あなたのサンプル接続文字列がそれと矛盾しているように、この投稿はSQL Serverとタグ付けされていてアクセスではありませんでした。
  3. テキストリーダーとカウンタ変数を使用して、データテーブルに30,000レコードを設定します。
  4. データテーブルを挿入クエリまたはストアドプロシージャに渡します。パラメーターの型はSqlDbType.Structuredです。
  5. ジョブが失敗して再起動する必要がある場合、最初のステップは、フィールド内の定義済みキーから最後に挿入された値を確認することです。また、テーブルに存在しないレコードのみを挿入するために、挿入クエリの一部として左外部結合を使用することもできます。これらは、失敗したETLジョブを再開するためのより一般的な手法のほんの一部です。

このテクニックは、バルクコピーに比べて柔軟性が増し、ターゲットテーブルに結合されていないため、テーブルの変更は変更の性質に応じて変化しにくいため、戦術上の利点があります。

+0

SteveDに感謝します。私はそれを変更しました 私は変更した私のコードをここでコメントすることはできません。今私はエラーが発生しているソースまたは宛先の列のマッチングは一致しません。 –

+0

データテーブルの列データ型は、SQL Serverのテーブル値型と一致する必要があります。また、csvファイルからdatatable(c#)に挿入するデータが、データ列で定義されている型に適合していることを確認する必要があります。だからすべてがテキスト - > datatable - >テーブル値のパラメータ – SteveD

+0

と一致する必要がありますスティーブ..ありがとうありがとう –

関連する問題