【问题标题】:Gathering Data from Oracle view in C#在 C# 中从 Oracle 视图中收集数据
【发布时间】:2022-01-08 21:46:04
【问题描述】:

在我的项目中,我想从 oracle 数据库中获取一些数据。

在oracle数据库中,表和视图是分开的。

所以我已经连接到数据库并尝试从视图中收集数据。

所以我写了这段代码来获取数据。但是,我在 dt.Load(dr) 行中返回一个错误,异常说 Specified Cast is not valid

谁能解释一下这个错误的含义以及如何避免这种情况?

这是我第一次使用 Oracle db。

            OracleConnection con = new OracleConnection("Data Source=TEST;Persist Security Info=True;UserID=app;Password=test;");
            con.Open();

            OracleCommand cmd = con.CreateCommand();
            cmd.CommandText = "SELECT * FROM P.INVENTORY_PART_IN_STOCK_UIV WHERE PART_NO = '90202-KPL-900D' and upper(P.Sales_Part_API.Get_Catalog_Group(CONTRACT, PART_NO) ) = upper('SPMB')";
            cmd.CommandType = CommandType.Text;
            OracleDataReader dr = cmd.ExecuteReader();
             
            DataTable dt = new DataTable();
            dt.Load(dr);
            dataGridView1.DataSource = dt.DefaultView;

【问题讨论】:

  • 查询返回哪些列类型?
  • @CaiusJard 字符串、整数、浮点数、日期时间
  • @CaiusJard 我意识到了这个问题。我试过选择一列。然后它返回数据。我认为问题来了,我从表中选择了 * 数据。
  • 听起来其中一列是数据表不支持的某种类型,例如地理、xml、blob。我会尝试查看所有不同的数据类型,然后从每个数据类型中选择一列其中,例如select someVarchar select somedatetimeselect someint .. 它可能会更快地缩小范围 - 从不寻常的开始(因为支持 varchar、datetime、int 等是非常标准的).. 这就是为什么我要求一个所有列类型的列表,因此我们可以猜测奇怪的列类型。您可以从中获取查询,CREATE VIEW tempview AS,然后描述视图并发布列表..

标签: c# oracle


【解决方案1】:

NUMBER 的 Oracle 列类型可以表示比 .NET 本机类型类型 Decimal 更高的精度。我假设您使用的是 IFS 数据库,并且遇到了同样的问题。我最终得到了一个使用 Entity Framework 的解决方案,并将任何 NUMBER 字段映射到 Double 并在本地转换为 Decimal。到目前为止,几年来我没有遇到任何转换问题。

正如 cmets 中所指出的,您可以在 select 语句中限制您的字段列表,但如果您需要调用 NUMBER 类型的列,您会遇到困难。快速而肮脏的解决方案是在任何 NUMBER 列周围使用 TO_CHAR 并在本地代码中进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2016-04-24
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多