Npgsql或您的PostgreSQL不支持类型System.UInt32

4
使用Npgsql V3.0.3.0向数据库表添加新记录时,遇到了一个问题:该表中有一列的类型为OID,在.NET中应该映射为UInt32。但当执行插入命令时,会抛出以下异常:"This .NET type is not supported in Npgsql or your PostgreSQL: System.UInt32"。异常中的堆栈跟踪信息如下:
at Npgsql.TypeHandlerRegistry.get_Item(Type type)
at Npgsql.TypeHandlerRegistry.get_Item(Object value)
at Npgsql.NpgsqlParameter.ResolveHandler(TypeHandlerRegistry registry)
at Npgsql.NpgsqlParameter.Bind(TypeHandlerRegistry registry)
at Npgsql.NpgsqlCommand.ValidateAndCreateMessages(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteNonQueryInternal()
at Npgsql.NpgsqlCommand.ExecuteNonQuery
DataReaderGetSchemaTable 方法显示该表的 OID 列的 "数据类型" 为 UInt32
1个回答

5

由于OID是一种相对内部/非标准的字段,Npgsql不会自动将UInt32写为OID;您需要通过设置参数的NpgsqlDbType字段为Oid来显式指定要写入OID。


NpgsqlDataReader的GetSchemaTable方法有一个名为“ProviderSpecificDataType”的列,但除非“DataType”为“DateTime”(此时显示“NpgsqlTypes.NpgsqlDateTime”),否则它始终为空。是否可能更新此方法以返回每行的“ProviderSpecificDataType”。我正在使用此GetSchemaTable方法在T4脚本中自动生成每个表的.Net类,但是如果没有“ProviderSpecificDataType”,就无法确定哪些字段是OID(以设置NpgsqlDbType)。 - Casey
@Casey,ProviderSpecificDataType仅适用于支持两种CLR类型的列 - “常规”类型和特定于提供程序的类型;DateTime是一个很好的例子,因为CLR DateTime无法表示整个PostgreSQL时间戳范围。只需查找ProviderType,甚至更好的方法是调用NpgsqlDataReader的GetFieldType()方法。 - Shay Rojansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接