4

SqlbulkCopyを使用してExcelデータをSQLサーバーにインポートしていますが、問題は、重複するレコードが入力されないようにすることです。重複を無視または自動的に削除する方法はありますか?

protected void Button1_Click(object sender, EventArgs e)
{
    string strFileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();
    string strFileName = FileUpload1.PostedFile.FileName.ToString();

    FileUpload1.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType));
    string strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType);

    string excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strNewPath + "; Extended Properties=Excel 8.0;");

    // Create Connection to Excel Workbook
    using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
    {
        var command = new OleDbCommand("Select ID,Data FROM [Sheet1$]", connection);

        connection.Open();

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

            con.Open();
            DataTable dt1 = new DataTable();
            string s = "select count(*) from ExcelTable";
            string r = "";
            SqlCommand cmd1 = new SqlCommand(s, con);

            try
            {
                SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
                da1.Fill(dt1);
            }
            catch
            {
            }

            int RecordCount;
            RecordCount = Convert.ToInt32(cmd1.ExecuteScalar());
            r = RecordCount.ToString();
            Label1.Text = r;
            con.Close();
            int prv = Convert.ToInt32(r);

            // Bulk Copy to SQL Server
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
            {
                bulkCopy.DestinationTableName = "ExcelTable";

                SqlBulkCopyColumnMapping mapping1 = new SqlBulkCopyColumnMapping("excelid", "id");
                SqlBulkCopyColumnMapping mapping2 = new SqlBulkCopyColumnMapping("exceldata", "data");

                bulkCopy.ColumnMappings.Add(mapping1);
                bulkCopy.ColumnMappings.Add(mapping2);

                bulkCopy.WriteToServer(dr);
            }

            con.Open();

            DataTable dt = new DataTable();
            s = "select count(*) from ExcelTable";
            r = "";
            SqlCommand cmd = new SqlCommand(s, con);

            try
            {
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch
            {
            }

            RecordCount = Convert.ToInt32(cmd.ExecuteScalar());
            r = RecordCount.ToString();
            Label1.Text = r;
            con.Close();
            int ltr = Convert.ToInt32(r);

            if (prv == ltr)
            {
                Label1.Text = "No records Added";
            }
            else
            {
                Label1.Text = "Records Added Successfully !";
            }
        }
    }
}

重複を削除するトリガーを作成することで、この問題を修正できますか?はいの場合はどうですか?私は初心者です。トリガーを作成したことはありません。

もう1つの問題は、何を試しても列マッピングを機能させることができないことです。Excelシートとデータベースの列名が違うとデータをアップロードできません。

4

3 に答える 3

12

INDEXを作成できます

CREATE UNIQUE INDEX MyIndex ON ExcelTable(id, data) WITH IGNORE_DUP_KEY

また、データを一括でdbに挿入する場合、重複する値がすべて挿入されるわけではありません。

于 2012-10-24T15:53:17.043 に答える
0

私が覚えている限り、Excelファイル自体からインポートするときに冗長な行を除外することができます。

次のSQLクエリをOleDbCommandコンストラクターで使用する必要があります。

var command = new OleDbCommand("Select DISTINCT ID,Data FROM [Sheet1$]", connection);
于 2012-10-29T10:42:47.310 に答える
0

いいえ、データベースにロードする前にコード上のdrオブジェクトで管理するか(DISTINCT操作の実行など)、DBでチェックするトリガーを作成します。ただし、トリガーによってバルクインサートのパフォーマンスが低下します。

もう1つのオプションは、一時テーブルに一括挿入してから、selectDISTINCTを使用して一時テーブルから宛先テーブルに挿入することです。

于 2012-10-24T15:59:29.413 に答える