Предположим, у вас есть следующая таблица:
create table foo (
bar integer
)
Если вы подготовите вставку в таблицу следующим образом:
NpgsqlCommand cmd = new NpgsqlCommand("insert into foo values (:BAR)", conn);
cmd.Parameters.Add(new NpgsqlParameter("BAR", NpgsqlDbType.Integer));
Вероятно, это приведет к ошибке:
cmd.Parameters[0].Value = "Hello";
cmd.ExecuteNonQuery();
По той же причине это выдает ошибку:
insert into foo values ('Hello')
Это будет ясно работать, так как это целое число:
cmd.Parameters[0].Value = 5;
Ночто вы, возможно, не знаете, так это то, что следующее все еще будет работать, так как они являются совместимыми типами данных:
cmd.Parameters[0].Value = 5M;
cmd.Parameters[0].Value = 5f;
cmd.Parameters[0].Value = (short)5;
cmd.Parameters[0].Value = (long)5;
Однако, хотя PostgreSQL достаточно терпим, чтобы принять это в необработанном SQL:
insert into foo values ('5')
Npgsql 4 выдаст ошибку, о которой вы упомянули, при попытке сделать это:
cmd.Parameters[0].Value = "5";
cmd.ExecuteNonQuery();
Интересно, я почти уверен, что она работала с Npgsql 3.x, но я считаю ошибку улучшением.
Поскольку он ожидает числовой тип данных, простое решение состоит в том, чтобы любой .Value
, который вы назначаете, был также числовым типом данных, в идеале целое число:
cmd.Parameters[0].Value = Convert.ToInt32(yourObject);
cmd.ExecuteNonQuery();
Со стандартными предупреждениями оотлов ошибок и использование int.TryParse
.
Из приведенного выше кода на самом деле выглядит, как будто вы берете что-то, что уже может существовать, как целое число и конвертируете его в строку.Если вы покончите со всем этим, вы можете обнаружить, что это работает из коробки.В любом случае свойство .Value
должно быть числовым.