将Npgsql的文本类型转换为C#类型

4
我需要找到一种方法将以文本形式给出的Npgsql类型转换为C# Type对象。 代码示例:
public Type ConvertFromNpgsqlType(string a_sNpglsqType)
{
   //TODO
   if (string.Equals(a_sNpglsqType, "integer")
   {
     return typeof(int);
   }
   //...
   return typeof(object);
}

我有一个"a_sNpgsqlType"参数值,来自于pgsq查询的结果,其中包含以下值:

   i integer, OUT pass text,(...)

所有事情都非常简单...但我不知道如何将Npgsql字符串类型转换为C#类型对象。最简单的方法是创建一个非常长的“if else”语句,但在我看来,这是解决它最糟糕的方式:(

也许有人知道我该怎么做?:)

1个回答

9

我希望有这样的方法,但我怀疑没有。我有一个小型ORM,用于生成POCOs,我使用映射结构来实现这一点-将DbType转换为它映射到的各种其他类型。这并没有直接回答你的问题(因为我担心没有),但它确实为我们回答了同样的解决方案。

datatype                 system_enum                   csharp_dbtype   postgres_enum
bigint                   System.Data.DbType.Int64      Int64           NpgsqlTypes.NpgsqlDbType.Bigint
bit                      System.Data.DbType.Boolean    Boolean         NpgsqlTypes.NpgsqlDbType.Bit
bool                     System.Data.DbType.Boolean    Boolean         NpgsqlTypes.NpgsqlDbType.Boolean
boolean                  System.Data.DbType.Boolean    Boolean         NpgsqlTypes.NpgsqlDbType.Boolean
Box                      System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.Box
bpchar                   System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Text
_bpchar                  System.Data.DbType.String[]   String[]        NpgsqlDbType.Array | NpgsqlDbType.Text
bytea                    System.Data.DbType.Binary     Byte[]          NpgsqlTypes.NpgsqlDbType.Bytea
character                System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Char
character varying        System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Varchar
Circle                   System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.Circle
date                     System.Data.DbType.DateTime   DateTime        NpgsqlTypes.NpgsqlDbType.Date
float4                   System.Data.DbType.Single     Single          NpgsqlTypes.NpgsqlDbType.Real
float8                   System.Data.DbType.Double     Double          NpgsqlTypes.NpgsqlDbType.Double
inet                     System.Data.DbType.Object     IPAddress       NpgsqlTypes.NpgsqlDbType.Inet
_int2                    System.Data.DbType.Int16[]    Int16[]         NpgsqlDbType.Array | NpgsqlDbType.SmallInt
int2                     System.Data.DbType.Int16      Int16           NpgsqlTypes.NpgsqlDbType.Smallint
int4                     System.Data.DbType.Int32      Int32           NpgsqlTypes.NpgsqlDbType.Integer
_int4                    System.Data.DbType.Int32[]    Int32[]         NpgsqlDbType.Array | NpgsqlDbType.Integer
int8                     System.Data.DbType.Int64      Int64           NpgsqlTypes.NpgsqlDbType.Bigint
_int8                    System.Data.DbType.Int64[]    Int64[]         NpgsqlDbType.Array | NpgsqlDbType.BigInt
integer                  System.Data.DbType.Int32      Int32           NpgsqlTypes.NpgsqlDbType.Integer
interval                 System.Data.DbType.Object     TimeSpan        NpgsqlTypes.NpgsqlDbType.Interval
Line                     System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.Line
LSeg                     System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.LSeg
money                    System.Data.DbType.Decimal    Decimal         NpgsqlTypes.NpgsqlDbType.Money
name                     System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Name
numeric                  System.Data.DbType.Decimal    Decimal         NpgsqlTypes.NpgsqlDbType.Numeric
oid                      System.Data.DbType.UInt32     uint            NpgsqlTypes.NpgsqlDbType.Oid
Path                     System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.Path
Point                    System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.Point
Polygon                  System.Data.DbType.Object     Object          NpgsqlTypes.NpgsqlDbType.Polygon
public.citext            System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Text
smallint                 System.Data.DbType.Int16      Int16           NpgsqlTypes.NpgsqlDbType.Smallint
_text                    System.Data.DbType.String[]   String[]        NpgsqlDbType.Array | NpgsqlDbType.Text
text                     System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Text
time                     System.Data.DbType.Time       DateTime        NpgsqlTypes.NpgsqlDbType.Time
_timestamp               System.Data.DbType.DateTime[] DateTime[]      NpgsqlDbType.Array | NpgsqlDbType.Timestamp
timestamp                System.Data.DbType.DateTime   DateTime        NpgsqlTypes.NpgsqlDbType.Timestamp
timestamptz              System.Data.DbType.DateTime   DateTime        NpgsqlTypes.NpgsqlDbType.TimestampTZ
timestamp with time zone System.Data.DbType.DateTime   DateTime        NpgsqlTypes.NpgsqlDbType.TimestampTz
timetz                   System.Data.DbType.Time       DateTime        NpgsqlTypes.NpgsqlDbType.Time
unknown                  System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Text
uuid                     System.Data.DbType.Guid       Guid            NpgsqlTypes.NpgsqlDbType.Uuid
varchar                  System.Data.DbType.String     String          NpgsqlTypes.NpgsqlDbType.Varchar
_varchar                 System.Data.DbType.String[]   String[]        NpgsqlDbType.Array | NpgsqlDbType.Varchar
xid                      System.Data.DbType.UInt32     uint            NpgsqlTypes.NpgsqlDbType.Xid
xml                      System.Data.DbType.Xml        Xml.XmlDocument NpgsqlTypes.NpgsqlDbType.Xml

这并非全面,但如果我们发现了一个之前未见过的dbtype,我们会将其添加到映射表中。
“datatype”列是从返回的结果。

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