首页 文章

如何使用DbConnection.GetSchema以不可知的方式确定数据库列类型?

提问于
浏览
0

我想允许用户定义将用于获取某些信息的查询 . 用户连接的数据库也是用户可定义的 . 基本上用户需要执行的步骤是:

1 /选择数据提供者(这是DbProviderFactories.GetFactoryClasses()返回的提供者之一)

2 /通过填充绑定到所选DbProviderFactory返回的DbConnectionStringBuilder的属性网格来配置所选提供程序 .

3 /选择查询将在其上运行的表 . 表的列表来自DbConnection.GetSchema(“Tables”)(DbConnection来自选定的DbProviderFactory)

4 /选择包含查询所需数据的列(需要2列) . 其中一列必须是文本或整数,另一列必须是数字 .

我已经能够成功完成前3个步骤,但是在第4步遇到了问题 . 最初我连接到sql server数据库并且一切正常 . 现在我已经尝试使用oracle XE数据库了,我似乎遇到了问题 .

当我从模式查询DATA_TYPES时使用SQLServer2005 db我获得如下信息:

Type name     ProviderDbType    DataType

nchar           10              System.String
int           8               System.Int32

当我然后查询我的表中的列的架构时,我得到:

Column_Name     Data_Type
Id               nchar
Length           int

因此,在尝试将列类型(通过Data_type列值)映射到从DATA_TYPES架构表中针对Type_name键入的系统类型时 . 这一切都很好 .

然后我开始使用oracle(通过Odbc . 虽然DATA_TYPES信息似乎与我从列查询返回的信息是不同的 . 我得到的是:

Column_Name     Data_Type   Type_Name
Id                   8         VARCHAR2
Length              10         int

所以我之前从DATA_TYPES模式表中键入Type_Name并查找Data_Type的值以获取系统类型的策略不起作用,因为它使用键nchar存储系统类型然后尝试使用键查找它8 .

通过查看模式中可用的各种内容,我无法看到我是如何知道列查询中的哪一列映射到DATA_TYPES模式表中的哪一列 .

对长期问题抱歉,希望问题很清楚 .

2 回答

  • 1

    最好在应用程序级别编写包装函数,该函数包含解释每个数据库的特定代码,然后返回通用格式

  • 1

    您不应要求用户选择提供者 . 让用户选择数据库并获取应用程序以确定要使用的提供程序 .

    如果您使用OLE DB提供程序,是否可以使用OleDbType Enumeration

    Oracle内置了.NET和native OLE DB提供程序 .

    另见Data Type Mappings in ADO.NET

相关问题