代码之家  ›  专栏  ›  技术社区  ›  Michael Buen

如果with关键字不好(对于C#),这是一个不错的选择吗?

  •  2
  • Michael Buen  · 技术社区  · 16 年前
    var insInvoice = new NpgsqlCommand(
        @"INSERT INTO invoice_detail(
        invoice_id,
        invoice_detail_id,
        product_id,
        qty,
        price,
        amount)
        VALUES (
        :_invoice_id,
        :_invoice_detail_id,
        :_product_id,
        :_qty,
        :_price,
        :_qty * :_price)", c);
    
    
    with(var p = insInvoice.Parameters)
    {
        p.Add("_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id");
        p.Add("_invoice_detail_id", NpgsqlDbType.Uuid, 0, "invoice_detail_id");
        p.Add("_product_id", NpgsqlDbType.Uuid, 0, "product_id");
        p.Add("_qty", NpgsqlDbType.Integer, 0, "qty");
        p.Add("_price", NpgsqlDbType.Numeric, 0, "price");
    }
    

    kludge:
    
    for(var p = insInvoice.Parameters; false;)
    {       
        p.Add("_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id");
        p.Add("_invoice_detail_id", NpgsqlDbType.Uuid, 0, "invoice_detail_id");
        p.Add("_product_id", NpgsqlDbType.Uuid, 0, "product_id");
        p.Add("_qty", NpgsqlDbType.Integer, 0, "qty");
        p.Add("_price", NpgsqlDbType.Numeric, 0, "price");      
    }
    
    4 回复  |  直到 16 年前
        1
  •  6
  •   Jon Skeet    16 年前

    var insInvoice = new NpgsqlCommand(sql)
    {
        Parameters = 
        {
            { "_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id" },
            { "_invoice_detail_id", NpgsqlDbType.Uuid, 0, "invoice_detail_id" },
            { "_qty", NpgsqlDbType.Integer, 0, "qty" },
            { "_price", NpgsqlDbType.Numeric, 0, "price" }
        }
    };
    

    有关对象和集合初始值设定项的详细信息,请下载的第8章 C# in Depth

        2
  •  3
  •   Patrik Hägne    16 年前

    确定“p”变量的范围有什么意义?

    //with(var p = insInvoice.Parameters)
    {
      var p = insInvoice.Parameters;
      p.Add("_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id");
      p.Add("_invoice_detail_id", NpgsqlDbType.Uuid, 0, "invoice_detail_id");
      p.Add("_product_id", NpgsqlDbType.Uuid, 0, "product_id");
      p.Add("_qty", NpgsqlDbType.Integer, 0, "qty");
      p.Add("_price", NpgsqlDbType.Numeric, 0, "price");
    }
    
        3
  •  0
  •   yfeldblum    16 年前

    我也做过类似的事情:

    var insInvoice = new NpgsqlCommand(...);
    insInvoice.Parameters.With(p => {
        p.Add("_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id");
        ...
    });
    
        4
  •  0
  •   Daniel Earwicker    16 年前

    如果您真的想通过消除噪音和“仪式”来降低代码的可读性,那么在您的示例中还有更重要的事情要做。

    db.Insert(Invoices.Table,
          new Value(Invoices.ID, "{something-something}"),
          new Value(Invoices.Quantity, 52),
          /*... and so on*/);
    

    无需手动编写大型SQL插入。根据列名自动选择的参数名。名称类型和大小信息都绑定在 Invoices 这样你就不会弄错了。在调用点相邻指定的名称和值。这一切都可能是你的!

    或者,以某种整洁的XML结构声明数据库的结构,并编写一个工具,从该XML生成两件事:1。用于设置数据库的DDL和2。每个表及其列的C#元数据。现在要扩展DB结构,只需编辑XML并重新运行该工具,它就可以让您从代码中轻松地访问模式。

    在您知道之前,您已经拥有了自己的廉价且令人愉快的预算版LINQtoSQL!

    (显然,这偏离了主题,但为什么不在这个圣诞节用一种简单的方式写插入语句呢?)