0

約21個のlacエントリを含むテキストファイルがあり、これらすべてのエントリをテーブルに挿入したいと思います。最初に、c#で1行ずつ読み取り、テーブルに挿入する関数を1つ作成しましたが、時間がかかりすぎます。これらのバルクデータを挿入する効率的な方法を提案してください。そのファイルには、区切り文字としてTAB(4スペース)が含まれています。
また、そのテキストファイルには重複するエントリがいくつか含まれているため、これらのエントリを挿入したくありません。

4

1 に答える 1

4

DataTableすべてのデータをオブジェクトにロードしてから、を使用SqlBulkCopyしてそれらを一括挿入します。

DataTable dtData = new DataTable("Data");

// load your data here

using (SqlConnection dbConn = new SqlConnection("db conn string"))
{
    dbConn.Open();

    using (SqlTransaction dbTrans = dbConn.BeginTransaction())
    {
        try
        {
            using (SqlBulkCopy dbBulkCopy = new SqlBulkCopy(dbConn, SqlBulkCopyOptions.Default, dbTrans))
            {
                dbBulkCopy.DestinationTableName = "intended SQL table name";
                dbBulkCopy.WriteToServer(dtData );
            }

            dbTrans.Commit();
        }
        catch
        {
            dbTrans.Rollback();
            throw;
        }
    }

    dbConn.Close();
}

これをラップする例を含めたSqlTransactionので、途中で障害が発生した場合は完全なロールバックが発生します。はじめに、区切り文字で区切られたデータをオブジェクトにロードするためのCodeProjectの優れた記事を次に示します。DataSet

ロードする前にデータをサニタイズする

OK、これがあなたのデータがどのように見えるかです:

CC_FIPS    FULL_NAME_ND 
AN         Xixerella
AN         Vila 
AN         Sornas
AN         Soldeu
AN         Sispony
... (cut down for brevity)

DataTableこの例では、次のように作成します。

DataTable dtData = new DataTable("Data");
dtData.Columns.Add("CC_FIPS");
dtData.Columns.Add("FULL_NAME_ND");

次に、各行を繰り返し(タブ区切りのデータがキャリッジリターンによって行ごとに区切られていると仮定)、このデータがメソッドをDataTable使用してすでに存在するかどうか、.Selectおよび一致するかどうかを確認します(両方の値を確認しています) 、何か他のことをしたいかどうかはあなた次第です)それからそれを追加しないでください。それによって重複を防ぎます。

using (FileStream fs = new FileStream("path to your file", FileMode.Open, FileAccess.Read))
{
    int rowIndex = 0;
    using (StreamReader sr = new StreamReader(fs))
    {
        string line = string.Empty;
        while (!sr.EndOfStream)
        {
            line = sr.ReadLine();

            // use a row index to skip the header row as you don't want to insert CC_FIPS and FULL_NAME_ND
            if (rowIndex > 0)
            {
                // split your data up into a 2-d array tab delimited
                string[] parts = line.Split('\t');

                // now check whether this data has already been added to the datatable
                DataRow[] rows = dtData.Select("CC_FIPS = '" + parts[0] + "' and FULL_NAME_ND = '" + parts[1] + "'");
                if (rows.Length == 0)
                {
                    // if there're no rows, then the data doesn't exist so add it
                    DataRow nr = dtData.NewRow();
                    nr["CC_FIPS"] = parts[0];
                    nr["FULL_NAME_ND"] = parts[1];
                    dtData.Rows.Add(nr);
                }
            }

            rowIndex++;
        }
    }
}

この最後に、DataTable一括挿入できるサニタイズが必要です。このコードはテストされていないことに注意してください、しかしそれはあなたがそれをどのように行うべきかについての最良の推測です。これを行うには多くの方法があり、おそらくこの方法(特にLINQ)よりもはるかに優れていますが、これは出発点です。

于 2013-01-03T09:25:24.423 に答える