带有Npgsql的C#-无法编写处理程序类型为Int32Handler

时间:2018-12-03 11:09:12

标签: c# postgresql npgsql

我在尝试将整数添加到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:无法编写处理程序类型为Int32Handler \的CLR类型System.String \

     

在lambda_method中(Closure,NpgsqlTypeHandler,Object,NpgsqlLengthCache&,NpgsqlParameter)

     

位于C:\ projects \ npgsql \ src \ Npgsql \ NpgsqlParameter.cs:line 553中的Npgsql.NpgsqlParameter.ValidateAndGetLength()      

在C:\ projects \ npgsql \ src \ Npgsql \ NpgsqlCommand.cs:line 793中的Npgsql.NpgsqlCommand.ValidateParameters()上

     

在C:\ projects \ npgsql \ src \ Npgsql \ NpgsqlCommand.cs:line 1141行中的Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior行为,布尔异步,CancellationToken cancelleToken)      

位于C:\ projects \ npgsql \ src \ Npgsql \ NpgsqlCommand.cs:line 1042中的Npgsql.NpgsqlCommand.ExecuteNonQuery(布尔异步,CancellationToken cancelledToken)

     

在C:\ projects \ npgsql \ src \ Npgsql \ NpgsqlCommand.cs:line 1025中的Npgsql.NpgsqlCommand.ExecuteNonQuery()中

     

在/Users/kamilkostrzewski/Projects/BitcoinType/BitcoinType/Program.cs:line 261中的BitcoinType.DatabaseManager.MakeInsert(Dictionary`2 requestData)中

This并没有帮助我。

3 个答案:

答案 0 :(得分:1)

我遇到了这个问题,我这样解决了。在我的数据库中,我有一列键入Integer。如果要在此列中添加数据,则应使用 NpgsqlDbType.Integer 数据类型。但是,当我使用 NpgsqlDbType.String 数据类型时,会出现该错误。

因此,您应该更改NpgsqlDBtType。希望对您有帮助。

答案 1 :(得分:0)

很难理解上面的代码示例-创建并填充parameter,然后在注释中添加NpgsqlParameter的完全不同的实例。

但是,错误消息清楚地表明您正在尝试将字符串写为整数。当您将NpgsqlParameter.Value设置为字符串值,但将其NpgsqlDbType设置为Integer时,会发生这种情况。完全省略设置NpgsqlDbType(Npgsql通常会从值中推断出正确的类型),或者确保它们正确对齐。

答案 2 :(得分:0)

假设您有下表:

for (int i=l; i<=r; i++){
    if((i%2)==1)
        arraylist.add(i);
}

如果您按以下方式准备插入表中:

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;

但是,即使PostgreSQL足够宽容,也可以在原始SQL中接受它:

cmd.Parameters[0].Value = 5M;
cmd.Parameters[0].Value = 5f;
cmd.Parameters[0].Value = (short)5;
cmd.Parameters[0].Value = (long)5;

Npgsql 4将在尝试执行此操作时抛出您提到的错误:

insert into foo values ('5')

有趣的是,我很确定它可以与Npgsql 3.x一起使用,但是我认为该错误有所改善。

由于期望使用数字数据类型,因此简单的解决方案是确保您分配的任何cmd.Parameters[0].Value = "5"; cmd.ExecuteNonQuery(); 也是数字数据类型,最好是整数:

.Value

带有有关错误陷阱和使用cmd.Parameters[0].Value = Convert.ToInt32(yourObject); cmd.ExecuteNonQuery(); 的标准警告。

从上面的代码中,它实际上看起来像是要带走一些可能已经存在的整数并将其转换为字符串。如果您取消所有这些操作,则可能会发现它开箱即用。无论如何,int.TryParse属性必须是数字。