У меня есть существующая база данных с таблицей, в которой используется PostgreSQL ENUM:
CREATE TYPE product_location_enum AS ENUM ('manufacture', 'Q.A.', 'stock', 'customer', 'scrapped');
И соответствующее C# определение:
enum ProductLocationEnum
{
[PgName("manufacture")]
manufacture,
[PgName("Q.A.")]
Q_A_,
[PgName("stock")]
stock,
[PgName("customer")]
customer,
[PgName("scrapped")]
scrapped,
}
Таблица загружается в DataGridView следующим образом:
NpgsqlConnection.GlobalTypeMapper.MapEnum<ProductLocationEnum>("product_location_enum");
string sQuery = "SELECT * FROM product";
DataTable DT = new DataTable();
conn = new NpgsqlConnection( conn_string );
conn.Open();
DataTable dt = new DataTable();
productDA = new NpgsqlDataAdapter();
productDA.SelectCommand = new NpgsqlCommand(sQuery, conn);
NpgsqlCommandBuilder builder = new NpgsqlCommandBuilder(productDA);
productDA.UpdateCommand = builder.GetUpdateCommand();
productDA.Fill(dt);
bindingSource = new BindingSource();
dgvProduct.DataSource = bindingSource;
bindingSource.DataSource = dt;
Чтобы зафиксировать изменения, внесенные в DataGridView, я делаю следующее (в настоящее время на button_click):
productDA.Update((DataTable)bindingSource.DataSource);
Это, к сожалению, вызывает исключение Npg sql .PostgresException :
invalid input value for enum product_location_enum: "4"
Я часами искал, что делаю неправильно, но не могу найти ответа. Некоторые из вещей, которые я пробовал:
- Создайте свой собственный INpgsqlNameTranslator для перечисления. TranslateMemberName вызывается при загрузке, но НЕ при выполнении Update ().
- Я пытался поиграть с UpdateCommand.Parameters [], но похоже, что метод Update () генерирует новую команду UpdateCommand, поскольку мои изменения полностью игнорируются и когда я проверяю UpdateCommand с прерванным отладчиком исключения, он полностью изменился по сравнению с исходным, предоставленным builder.GetUpdateCommand (). В этом есть смысл, поскольку он, вероятно, адаптирует его к изменяемым столбцам.
Любая помощь и идеи приветствуются.