Я строю проект WinForms в C# с использованием базы данных PostgreSQL и каркаса Npg sql.
Для вставки записи мне нужно вернуть идентификатор новой записи. Этот вопрос SO говорит о добавлении SELECT SCOPE_IDENTITY()
к строке запроса, передаваемой в cmd. Таким образом, моя строка запроса выглядит следующим образом:
string insertString = "INSERT INTO sometable (company_name, category, old_value, old_desc, new_value, new_desc, reference1, reference2) VALUES (@comp, @cat, @oldValue, @oldDesc, @newValue, @newDesc, @ref1, @ref2); SELECT SCOPE_IDENTITY();";
, а затем получить идентификатор с чем-то вроде
int modified = cmd.ExecuteNonQuery();
Но это, вероятно, SQL Спецификация сервера c. Если я использую этот метод, я получаю исключение в вышеприведенной строке, говорящее: «fuction scope_identity () не существует».
Я не смог найти ничего, что могло бы решить эту проблему на Npg sql документация .
По связанному вопросу SO и предложениям Дениса я попытался добавить и
RETURNING id;
и
CURRVAL(pg_get_serial_sequence('my_tbl_name','id_col_name'))
в строка запроса, заменив SELECT SCOPE_IDENTITY();
на эти операторы в коде выше. В обоих случаях они работают как положено в DBeaver на вставке, но в моем C# коде в моем проекте WinForm значение «1» было изменено.
ПРИМЕЧАНИЕ. Я переименовал вопрос и добавил еще информация о том, что я сделал.