【问题标题】:Is there a less torturous way to INSERT INTO?有没有更痛苦的方式来插入?
【发布时间】:2017-08-21 15:49:22
【问题描述】:

如果我想将多个对象插入 SQL Server 数据库,我似乎必须这样做:

        using (var command = new SqlCommand(@"INSERT INTO Table1 (
            Param_1,
            Param_2,
            Param_3,
            ...
            )
            VALUES (
            @param1,
            @param2,
            @param3,
            ...
            )",conn))
            {
              command.Params.Add("@param1",...);
              command.Params.Add("@param2",...);
              command.Params.Add("@param3",...);
              ...
              foreach(var o in objects)
              {
                command.Params["@param1"].Value = o.Param1;
                command.Params["@param2"].Value = o.Param2;
                command.Params["@param3"].Value = o.Param3;
                ...
                command.ExecuteNonQuery();
              }
            }

仅仅把这些放在一起就让我大吃一惊,我有一张有 28 个字段的表格。我必须分 4 次写出那个长长的列表,只有最微不足道的区别(数据库字段名称可能使用不同的命名约定)。看起来很疯狂;有没有更短的方法?

Entity Framework 对我来说不是一个选项,这本来是我的第一选择,我必须滚动代码。

【问题讨论】:

  • 你能用Dapper吗?
  • 使用 ORM 或至少有参数名称列表并以编程方式创建命令和参数。
  • @MarkC。这有什么帮助?然后我的存储过程也有28个参数!
  • 如果要插入大量行,请结合使用 SqlBulkCopy 和 DataTable 或 DbDataReader。您可以使用 MoreLINQ 的 ToDataTable() 等扩展方法轻松地将集合转换为数据表。 SqlBulkCopy 的性能类似于 BULK INSERT
  • 您还可以使用Table-Valued Parameters 并将多个项目作为单个表类型参数传递给存储过程或脚本。

标签: c# .net sql-server .net-4.5 sqlconnection


【解决方案1】:

如果你完全反对使用外部库,那怎么样?

void Insert (Dictionary <string, SqlType> cols, Object [] objects)
{
    string colNames = string.Join (",", cols.Keys);
    string paramNames = string.Join (",", cols.Keys.Select (c=>"@"+c));

    using (var command = new SqlCommand(@"INSERT INTO Table1 (" + colNames + 
           ") VALUES (" + paramNames + ")",conn))
    {
          foreach (var col in cols)
          {
             command.Params.Add("@" + col.Key, col.Value);
          }

          foreach(var o in objects)
          {
            // Here you would have to list them all unless
            // your object o is a Dictionary<string, object> or a DataRow.
            command.Params["@param1"].Value = o.Param1;
            command.Params["@param2"].Value = o.Param2;
            command.Params["@param3"].Value = o.Param3;
            ...
            command.ExecuteNonQuery();
          }
     }
}

【讨论】:

  • 如果您要创建这样的字典,为什么不创建一个DataTable 并使用SqlBulkCopy 或TVP?这样可以避免循环,指定参数并提高性能
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多