2
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

4 に答える 4

6

適切な形式の「Add」メソッドがあるので、パラメーターにコレクション初期化子を使用できます。

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" }
    }
};

オブジェクトとコレクションの初期化子の詳細については、C#の第8章をDepthで無料でダウンロードできます。

于 2008-12-21T10:50:41.380 に答える
3

「p」変数のスコープを設定することのポイントは何ですか?

その場合は、中括弧を使用してスコープを作成し、with ステートメントをすべて削除して、「p」の変数宣言を新しいスコープに移動します。このように、「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");
}
于 2008-12-21T09:47:29.293 に答える
0

ノイズと「セレモニー」を取り除くことでコードをより読みやすいものに減らすことに本当に興味がある場合は、例で揚げる大きな魚があります。

この場合、拡張メソッド、静的な読み取り専用メタデータ、params配列などを組み合わせて使用​​すると、手動でコーディングするのではなく、その挿入ステートメントのSQLを自動生成できるはずです。特定の挿入がこれよりも複雑に見えるのはなぜですか。

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

大きなSQL挿入を手動で作成する必要はありません。列名に基づいて自動的に選択されるパラメーター名。名前のタイプとサイズの情報はすべて、の静的メンバーにバインドされているInvoicesため、誤解することはありません。呼び出しの時点で隣り合って指定された名前と値。これはすべてあなたのものかもしれません!

必要に応じて、データベースの構造を適切なXML構造で宣言し、そのXMLから2つのものを生成するツールを作成します。1。データベースをセットアップするためのDDLと2.すべてのテーブルとその列のC#メタデータ。DB構造を拡張するには、XMLを編集してツールを再実行するだけで、コードからスキーマにすぐに簡単にアクセスできます。

あなたがそれを知る前に、あなたはあなた自身の安くて陽気な予算バージョンのLinq toSQLを持っています!

(明らかに、これは話題から外れていますが、今年のクリスマスに挿入ステートメントを書く簡単な方法に身を任せてみませんか?)

于 2008-12-21T11:05:17.623 に答える
0

私は似たようなことをしました:

var insInvoice = new NpgsqlCommand(...);
insInvoice.Parameters.With(p => {
    p.Add("_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id");
    ...
});
于 2008-12-21T09:00:20.543 に答える