если ключевое слово with плохо (для C #), это хорошая альтернатива? - PullRequest
2 голосов
/ 21 декабря 2008
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 ]

6 голосов
/ 21 декабря 2008

Поскольку у вас есть метод «Добавить» с правильной формой, вы можете использовать инициализатор коллекции для параметров:

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 # в глубине .

3 голосов
/ 21 декабря 2008

Какой смысл в том, чтобы охватывать переменную "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");
}
0 голосов
/ 21 декабря 2008

Если вы действительно заинтересованы в том, чтобы свести код к чему-то более удобочитаемому, убрав из него шум и «церемонию», в вашем примере есть более крупная рыба, которую нужно жарить.

В этом случае, используя комбинацию методов расширения, некоторых статических метаданных только для чтения, массивов params и т. Д., Вы должны иметь возможность автоматически генерировать SQL для этого оператора вставки, а не кодировать его вручную. Почему любая вставка выглядит более сложной, чем эта:

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 # для каждой таблицы и ее столбцов. , Теперь, чтобы расширить структуру БД, просто отредактируйте XML и перезапустите инструмент, и он мгновенно предоставит вам легкий доступ к схеме из вашего кода.

Прежде чем вы это узнаете, у вас есть своя дешевая и веселая бюджетная версия Linq to SQL!

(Очевидно, это отклонилось от темы, но почему бы не побаловать себя простым способом написания операторов вставки в это Рождество?)

0 голосов
/ 21 декабря 2008

Я сделал нечто подобное:

var insInvoice = new NpgsqlCommand(...);
insInvoice.Parameters.With(p => {
    p.Add("_invoice_id", NpgsqlDbType.Uuid, 0, "invoice_id");
    ...
});
...