C # с Npgsql - не могу записать тип CLR System.String с типом обработчика Int32Handler - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблема при попытке добавить целое число в базу данных Postgresql.Varchars работает нормально, но когда я использую код:

var parameter = cmd.CreateParameter();
parameter.Value = Int32.Parse(x.Value.ToString());
Console.WriteLine(parameter.Value);
parameter.ParameterName = x.Key.ToString();
cmd.Parameters.Add(new NpgsqlParameter("confirmations",NpgsqlTypes.NpgsqlDbType.Integer));
for (int search=0; search != cmd.Parameters.Count; search++)

ошибка при выполнении, где я использую:

 cmd.ExecuteNonQuery();

звучит так:

Проблема с базой данных: System.InvalidCastException: Невозможно записать тип CLR System.String с типом обработчика Int32Handler \

в lambda_method (Closure, NpgsqlTypeHandler, Object, NpgsqlLengthCache &, NpgsqlParameter) * 1012 л.с.() в C: \ projects \ npgsql \ src \ Npgsql \ NpgsqlParameter.cs: строка 553

в Npgsql.NpgsqlCommand.ValidateParameters () в C: \ projects \ npgsql \ src \ Npgsql \ Npgs.строка 793

в Npgsql.NpgsqlCommand.ExecuteDbDataReader (поведение CommandBehavior, логический асинхронный, CancellationToken cancellationToken) в C: \ projects \ npgsql \ src \ Npgsql \ 101p * * * 101 * at. ng1. ng1. at. 419.NpgsqlCommand.ExecuteNonQuery (логический асинхронный, CancellationToken cancellationToken) в C: \ projects \ npgsql \ src \ Npgsql \ NpgsqlCommand.cs: строка 1042

в Npgsql.NpgsqlComd.ExecuteNonQuery () в C: \ projects \ npgsql \ src \ Npgsql \ NpgsqlCommand.cs: строка 1025

в BitcoinType.DatabaseManager.MakeInsert (Dictionary`2 requestData) в / Users / kamilkostrzewins Project/BitcoinType/Program.cs:line 261

Это мне не помогло.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Предположим, у вас есть следующая таблица:

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 должно быть числовым.

0 голосов
/ 26 августа 2019

У меня была эта проблема, и я решил вот так.В моей базе данных у меня есть столбец с типом Integer.Если вы хотите добавить данные в этот столбец, вы должны использовать NpgsqlDbType.Integer datatype.Но когда я использую NpgsqlDbType.String datatype, я получаю эту ошибку.

Поэтому вы должны изменить свой NpgsqlDBtType.Я надеюсь, что это поможет вам.

0 голосов
/ 04 декабря 2018

Трудно понять ваш пример кода выше - вы создаете и заполняете parameter, но затем добавляете в комментарий совершенно другой экземпляр NpgsqlParameter.

Однако в сообщении об ошибке ясно сказано, что выпытаемся написать строку как целое число.Это происходит, когда вы устанавливаете NpgsqlParameter.Value в строковое значение, но устанавливаете его NpgsqlDbType в Integer.Либо вообще не указывайте NpgsqlDbType (Npgsql обычно выводит правильный тип из значения), либо убедитесь, что они правильно выровнены.

...