2012-03-01 3 views
0

申し訳ありませんが、私のEnghistは良くありません!表の既存の列は、(既存のチェックではない)輸入のためにインポートの前にテーブルの既存のレコードをチェックしてasp.netのSQL ServerにExcelファイルをインポート

My機能の仕事だけでなく、この行をインポートdo'ntの場合、

string excelConnectionString = ""; 
    string strFileName = DateTime.Now.ToString("ddMMyyyy_HHmmss"); 
    string strFileType = System.IO.Path.GetExtension(fileuploadExcel.FileName).ToString().ToLower(); 
    fileuploadExcel.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType)); 
    string strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType); 
    //Connection String to Excel Workbook 
    if (strFileType.Trim() == ".xls") 
    { 
     excelConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strNewPath + ";Extended Properties=Excel 8.0;Persist Security Info=False"; 
    } 
    else if (strFileType.Trim() == ".xlsx") 
    { 
     excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strNewPath + ";Extended Properties=Excel 12.0;Persist Security Info=False"; 
    } 

    //Create Connection to Excel work book 
    OleDbConnection excelConnection =new OleDbConnection(excelConnectionString); 
    //Create OleDbCommand to fetch data from Excel 
    OleDbCommand cmd = new OleDbCommand("Select [account_id], [type],[first_name], [last_name], [title], [birthday], [tel],[phone], [email_1],[email_2], [remark],[del_if] from [Sheet1$]",excelConnection); 
    excelConnection.Open(); 
    OleDbDataReader dReader; 
    dReader = cmd.ExecuteReader(); 
    SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection); 
    //Give your Destination table name 
    sqlBulk.DestinationTableName = "contact"; 

    sqlBulk.WriteToServer(dReader); 

答えて

0

私があれば知らないエクセルFIEをチェックする方法

これはSqlBulkCopyを使用して可能になります。あなたができることは、ステージングテーブルにデータを書き込んで、まだ存在しないレコードだけをコピーすることです。その後、コピーが完了したらステージングテーブルをクリアすることができます。

編集:

ステージング表を使用することを望んでいないについてコメントを考えると、あなたはおそらく、データを読み込む前に、あなたの「連絡先」テーブルから(おそらくあなたの例からACCOUNT_ID)キー値の明確なリストを見つけることができますExcelファイルから読み込んだレコードを除外するには、このリストを使用します。この利点は、必要のないExcelファイルからデータを読み取っていないことです。欠点は、あなたの「連絡先」テーブルが巨大である場合、またはデータを比較するために使用するキーがaccount_idのような単純なものではない場合、これがすべて効率的でない可能性があるということです。

ファイルが巨大ではない場合は、挿入物にwhere句を使用してレコードを行単位で挿入して不要な重複を作成しないようにすることもできます。これはSqlBulkCopyよりも大幅に遅くなりますが、うまくいくでしょう。

+0

SqlBulkCopyを使用できない場合、別の方法を使用できます。私は、 "輸入前にチェックする"ことを解決したい。ステージングテーブルに書き込んだ後、まだ存在していないレコードを他のタルベにコピーすると、より複雑になる可能性があります。 – Hainlp

+0

@ Hainlp-編集した投稿にいくつかの選択肢があります。彼らが何らかの使用を望むことを願っています。がんばろう。主な問題は、SqlBulkCopyは選択挿入には役に立ちません。できるだけ早くデータを取り込むだけです。問題の要点は、まずデータベースに入れるデータをフィルタリングするか、SqlBulkCopyを使用しないことです。 –

+0

@ムース:ありがとう。私はストアのプロシージャとインポートする他の方法(SqlBulkCopyを使用しないでください)を見つけるために詳細を読む必要があると思います。ありがとうミースムースもう一度:)。 – Hainlp

関連する問題