【问题标题】:ADO.NET Call stored procedure efficientlyADO.NET 高效调用存储过程
【发布时间】:2018-10-13 18:09:23
【问题描述】:

我有一个在数据库表中插入/更新条目的存储过程。 我还有一个网络服务,需要每隔几秒将大量新更新传递到数据库中。

我想在不影响性能的情况下完成此任务,但我不确定如何最好地解决此问题。

这是我的代码(尽可能简化)

*注意:我使用数据表是因为存储过程使用的参数之一是来自数据库的自定义用户定义的表类型。

public class DBWorker
{
    public void Update(IEnumerable<UpdateModel> updates)
    {
        using (SqlConnection connection = new SqlConnection(this._connectionString))
        using (SqlCommand command = new SqlCommand(this._storedProcedureString, connection) { CommandType = CommandType.StoredProcedure })
        {
            foreach (var update in updates)
            {
                command.Parameters.Add("@EntryID", SqlDbType.Int).Value = update.EntryID;
                command.Parameters.Add("@Type", SqlDbType.Int).Value = update.Type;

                DataTable dataTable = new DataTable();
                dataTable.Columns.Add("ParamID");
                dataTable.Columns.Add("Value");
                DataRow row = dataTable.NewRow();
                row["ParamID"] = update.ParamID;
                row["Value"] = update.Value;
                dataTable.Rows.Add(row);

                command.Parameters.Add("@NameValues", SqlDbType.Structured).Value = dataTable;
                command.ExecuteNonQuery();
            }
        }
    }
}

public class UpdateModel
{
    public int EntryID { get; set; }

    public int Type { get; set; }

    public int ParamID { get; set; }

    public string Value { get; set; }
}

我主要担心的是上面的代码会对每次更新进行查询,如果我有很多更新,会大大减慢我的 DP。有什么方法可以在某些“bulk”模式下调用存储过程。

我正在考虑创建一个包含所有结果的数据表,然后以某种方式将其传递给存储过程,但我不确定这是否会带来实际的性能改进,也不知道如何实现它。

不确定是否重要,但这是 SP 实际更新的表结构:

  • ID - 整数、身份、PK
  • EntryID - int,notnull
  • 类型 - int,notnull
  • ParamID - int,notnull
  • 值 - varchar,notnull

【问题讨论】:

    标签: c# database stored-procedures ado.net bulkinsert


    【解决方案1】:

    你走在正确的道路上,但是......

    1. 您正在创建数据表、添加一行并将数据表传递给存储过程。对于每个 UpdateModel。最好在每次更新时创建一行(包含所有四列 - 来自更新对象的属性),然后将数据表(现在包含很多行)传递给 SP。
    2. 考虑一下该命令发生了什么 - 特别是您将添加多少参数(假设您在每次循环时都重新添加参数)。
    3. 为数据表中的列指定一些明确的数据类型

    对于更新序列,比如 20 次,您希望拥有一个包含 20 行、4 列、一个带有一个结构化参数的命令的数据表,并调用一次 SP。

    【讨论】:

    • 您可能还想打开连接,并在创建连接和命令之前创建数据表。在最短的时间内保持连接打开。
    • 感谢您的帮助。我会记住这一点,看看我能想出什么。不过有一个问题——3.“给出一些明确的数据类型”是什么意思?我正在为每个命令参数指定 SqlDbType。
    • 你好科比克。是的...但是 DataTable 中的列可以使用某些数据类型。如果您知道它们是什么,请指定它们。从逻辑上讲,您只需要 SqlCommand 的一个参数,但让列具有正确的数据类型总是很方便。如果不出意外,您的代码将在早期以明显的方式失败,而不是稍后以模糊的方式失败。
    • 太棒了,感谢您的精彩提示。我将相应地编辑我的代码。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多