1

ASP.NET Web アプリケーションがあり、複数のレコードを一度に削除および挿入する必要があります。

ユーザーがボタンをクリックするとします。このユーザーの既存のレコードをすべて削除し、新しいレコード セットをデータベースに挿入します。

たとえば、ユーザー A はデータベースに 720 のレコードを持っています。ユーザーがUpdateボタンをクリックすると、既存の 700 レコードが削除され、一連の新しいレコード (854 レコードとしましょう) がデータベースに挿入されます。

この機能は、ユーザーによって頻繁に使用されます。

私はこのようにする予定です:

  1. ユーザーのすべてのレコードを削除する

  2. すべてのレコードをコレクションに保存する

  3. a を使用しforeachてコレクション全体をループし、レコードを 1 つずつ挿入します

しかし、パフォーマンスの問題があるのではないかと心配しています。

これを行うより良い方法はありますか?

4

6 に答える 6

2

以下を実行する前に必要なのはDELETE、ユーザー レコードだけINSERTです。

これをデータベース操作として実行しない理由 (ユーザー レコードを挿入する前に、このコードを実行します):

DELETE FROM MyTable WHERE UserId = @UserId

レコードを挿入する最速の方法については、多くの投稿を見つけることができます。

SQL Server 2008 への非常に高速な挿入を行う方法

単一のテーブルに並行して挿入する最速の方法

于 2013-10-19T13:31:40.133 に答える
1

必要なフィールドを更新しないのはなぜですか?パフォーマンスが心配な場合は、Big ORM を使用する代わりに生のクエリを使用してください。あなたの必要性から判断すると、削除および挿入操作を行うときはトランザクションを使用する方がよいと思います。

これがあなたに役立つと思います:

ado-net-sqltransaction-improves-performance

于 2013-10-19T13:44:51.207 に答える
0

Datatable からデータベース テーブルに一括行を挿入できます。

私が何度も使用した次の使用:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Microsoft.ApplicationBlocks.Data;
    using System.Data.SqlClient;
    using System.Data;
    using AssamExitPollReport;
    using System.IO;
    using System.Drawing;
    using Spire.Xls;
    using System.Data.Sql;

    public partial class Default : System.Web.UI.Page
    {
        DataSet ds = new DataSet();
        clsdata obj = new clsdata();
        protected void Page_Load(object sender, EventArgs e)
        {

       string tablename = Request.QueryString["tablename"];

       // Response.ContentType = "text/xml";  //Set Content MIME Type. 
        Response.Write("<h3>Execution Started on " + DateTime.Now.ToLocalTime()+"</h3>");
        bool flg=false;
        if (tablename != null)
        {
            flg = BulkInsertDataTable(tablename);
            if (flg)
                Response.Write("<br><h3>Successfully executed on " + DateTime.Now.ToLocalTime() + "</h3>");
            else
                Response.Write("<br><h3>Oops! Something is wrong.</h3>");
        }
        else
            Response.Write("<br><h3>Oops! @parameter \"tablename\" is missing.</h3>");
    }



    //public bool BulkInsertDataTable(string tableName, DataTable dataTable)
    public bool BulkInsertDataTable(string tablename)
    {
        bool isSuccuss=true;
        try
        {
            string client = "Server=databasehost\\SQLEXPRESS;Database=dbname;Uid=username;Pwd=yourpassword;Trusted_Connection=no";
            ds = obj.Executedatasetcount("select_tablename");
            obj.ExecuteDataset("delete_temp", new object[] { tablename });
            using (SqlConnection destinationConnection = new SqlConnection(client))
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
            {
                destinationConnection.Open();
                bulkCopy.DestinationTableName = tablename;
                bulkCopy.WriteToServer(ds.Tables[0]);
                destinationConnection.Close();

            }
        }
        catch (Exception ex)
        {
            isSuccuss = false;
        }

        return isSuccuss;
    }

    private void elseif(bool p)
    {
        throw new NotImplementedException();
    }
}

clsdata クラスは、プロシージャの実行に使用されます。

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Microsoft.ApplicationBlocks.Data;

namespace AssamExitPollReport
{
    public class clsdata
    {
       // string conn = "Data Source=ADMIN-B19C3BADF;Initial Catalog=bazarkhodro;Integrated Security=True";



        public DataSet Executedataset(string spName)
        {
            return SqlHelper.ExecuteDataset(System.Configuration.ConfigurationManager.ConnectionStrings["conn1"].ConnectionString, CommandType.StoredProcedure, spName);
        }
        public DataSet ExecuteDataset(string spName, object[] values)
        {
            return SqlHelper.ExecuteDataset(System.Configuration.ConfigurationManager.ConnectionStrings["conn1"].ConnectionString, spName, values);
        }
        public DataSet ExecuteDataset(string spName, object[] values, string conn)
        {
            return SqlHelper.ExecuteDataset(conn, spName, values);
        }
        public int ExecuteNonQuery(string spName, object[] values, string conn)
        {
            int i = 0;
            try
            {

                i = SqlHelper.ExecuteNonQuery(conn, spName, values);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return i;

        }

        public int ExecuteScaler(string spName, object[] values)
        {
            int i = 0;
            try
            {
                i = Convert.ToInt32(SqlHelper.ExecuteScalar(System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString, spName, values));
            }
            catch (Exception)
            {

                throw;
            }
            return i;
        }

        public int ExecuteScaler(string spName, object[] values, string conn)
        {
            int i = 0;
            try
            {
                i = Convert.ToInt32(SqlHelper.ExecuteScalar(conn, spName, values));

            }
            catch (Exception)
            {

                throw;
            }
            return i;
        }

    }
}

conn(接続文字列)はweb.configで初期化されます

于 2013-12-05T14:57:38.880 に答える
0

多くのレコードが同じままであるか、更新する必要があるだけである場合、削除と挿入のペアは必要ありません。MERGEステートメントをテーブル値パラメーターと一緒に使用して、挿入、更新、および削除を 1 つの最大限に効率的なステートメントで一度に実行できます。これがおそらく最速の方法です。MERGE最適な方法ですべての書き込みを一度に実行できるように最適化されています。

私の経験では、この手法は実際にはうまく機能します。

于 2013-10-19T14:09:40.633 に答える