Если у меня есть инструкция по обновлению, такая как update foo set bar = @bar, baz = @baz
, и создайте команду, в которой отсутствуют параметры, похоже, что обновление будет использовать текущие значения для этих столбцов.Поведение по умолчанию по умолчанию Npgsql
Я не смог найти документацию для этого в Npgsql или Postgresql - это поддерживаемая функция, на которую я могу положиться, или просто что-то, что происходит?
тривиальный пример:
using System;
using Npgsql;
namespace MissingParametersUpdate
{
static class Program
{
// you will need to have CREATE TABLE foo (bar integer, baz integer)
static void Main(string[] args)
{
using (var connection = new NpgsqlConnection(args[0]))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = @"delete from foo";
command.ExecuteNonQuery();
}
using (var command = connection.CreateCommand())
{
command.CommandText = @"insert into foo (bar, baz) values (1, 2), (3, 4)";
command.ExecuteNonQuery();
}
DumpValues("Initial", connection);
// empty update
using (var command = connection.CreateCommand())
{
command.CommandText = @"update foo set bar = @bar, baz = @baz";
command.ExecuteNonQuery();
}
DumpValues("Empty Update", connection);
// update bar
using (var command = connection.CreateCommand())
{
command.CommandText = @"update foo set bar = @bar, baz = @baz";
command.Parameters.AddWithValue(@"bar", 42);
command.ExecuteNonQuery();
}
DumpValues("Update Bar", connection);
// update baz
using (var command = connection.CreateCommand())
{
command.CommandText = @"update foo set bar = @bar, baz = @baz";
command.Parameters.AddWithValue(@"baz", 12);
command.ExecuteNonQuery();
}
DumpValues("Update Baz", connection);
}
}
private static void DumpValues(string caption, NpgsqlConnection connection)
{
Console.WriteLine(caption);
using (var command = connection.CreateCommand())
{
command.CommandText = @"select bar, baz from foo";
using (var reader = command.ExecuteReader())
while (reader.Read())
Console.WriteLine(" (bar: {0}, baz: {1})", reader.GetInt32(0), reader.GetInt32(1));
}
Console.WriteLine();
}
}
}