1

私は膨大なデータセットに取り組んでおり、CLR を使用して処理しています。CLR 処理は迅速に機能していますが、処理されたデータを (CLR を介して) データベースにすばやく移動する方法が必要です。

たとえば、次の clr コードを参照してください。

protected static string Normalize(string s) // space and special character remover
    {
        char[] arr = s.ToCharArray();
        arr = Array.FindAll<char>(arr, (c => char.IsLetterOrDigit(c)));
        return new string(arr).ToLower();
    }

    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void udpNormStr ()
    {
        SqlConnection con = new SqlConnection("context connection = true");
        SqlCommand cmd = new SqlCommand("Select cName from NamesTable", con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        DataTable fill = new DataTable();
        fill.Columns.Add("NormName", typeof(string));
        da.Fill(dt);
        cmd.CommandText = "insert into NormTable values (@nName)";
        cmd.Parameters.Add("@nName", SqlDbType.VarChar);
        foreach (DataRow row in dt.Rows)
        {
            fill.Rows.Add(Normalize(row[0].ToString()));
        }
        con.Open();
        foreach (DataRow row in fill.Rows)
        {
            cmd.Parameters["@nName"].Value = row[0];            
            cmd.ExecuteNonQuery();            
        }
        con.Close();
}

実行に多くの時間がかかり、その時間の 90% が挿入操作で無駄になっています。処理されたデータをデータベースに移動するより良い方法を提案してください(CLRを介して)。

4

4 に答える 4

6

SqlBulkCopy; すでにあるDataTableので、次を使用できます。

using (var bcp = new SqlBulkCopy(con))
{
    bcp.DestinationTableName = "NormTable";
    bcp.WriteToServer(dt);
}

ストリーミングデータの場合、カスタムIDataReader実装を作成して にフィードすることもできますWriteToServer

于 2013-05-16T10:52:17.210 に答える
1

SQLBulkCopyクラスを使用してみる

これは、ワンショットでDataTableをデータベースに挿入するサンプルメソッドです

 public static bool SaveDetails(DataTable dbTable)
    {
        try
        {
            SqlConnection conn = new SqlConnection("Data Source=akshay;Initial Catalog=CosmosDB;User Id=sa;Password=Nttdata123");
            conn.Open();
            SqlBulkCopy sbc = new SqlBulkCopy(conn);


            if (dbTable.Rows.Count > 0)
            {
                sbc.DestinationTableName = "Employee";
                sbc.WriteToServer(dbTable);              


            }

            sbc.Close();
            conn.Close();


            return true;



        }
        catch (Exception exp)
        {

            return false;
        }

    }
于 2013-05-16T10:51:47.940 に答える