【问题标题】:Oracle column default value in .NET.NET 中的 Oracle 列默认值
【发布时间】:2013-03-29 14:53:40
【问题描述】:

当我在 Oracle 中运行以下 SQL 时,列默认值报告正确(“测试”)。当我在 .NET 中运行相同的 SQL 时,报告的默认值为 NULL:

SELECT column_name, data_default FROM user_tab_columns WHERE table_name='MYTABLENAME'

有问题的列是 Varchar2。我还测试了一个数字列 - 同样的问题。

数据库版本是 Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

.NET 连接器是 ODP.NET

操作系统是 Windows 7 / 64

我从 all_tab_columns 得到相同的结果(NULL)

.NET 代码:

Dim provider As DbProviderFactory = DbProviderFactories.GetFactory("Oracle.DataAccess.Client")
Using connection As DbConnection = provider.CreateConnection
  connection.ConnectionString = "Data Source=localhost; User Id=userid; Password=password"
  connection.Open
  Using dt As New DataTable
    Using command As DbCommand = provider.CreateCommand
      command.CommandText = "SELECT column_name, data_default FROM user_tab_columns WHERE table_name='MYTABLENAME'"
      command.Connection = connection
      Using da As DbDataAdapter = provider.CreateDataAdapter
        da.SelectCommand = command
        da.Fill(dt)
      End Using
    End Using
    For Each row As DataRow in dt.Rows
      Response.Write(row("COLUMN_NAME") & " " & row("DATA_DEFAULT") & "<br>")
    Next
  End Using
End Using

【问题讨论】:

  • 你在这两种情况下都以同一个用户登录吗?
  • @BrankoDimitrijevic 是的
  • 你能发布你的 .NET 代码吗? Oracle 查询很好,所以问题一定存在。
  • @EdGibbs .NET 代码添加
  • 嗯,这看起来很可靠。我看到的唯一奇怪的是这一行:Using command。我主要使用 C#,所以我的 VB.NET 很糟糕,但是在 C# 中,你应该在 using 构造中实例化变量 - 你不应该提前实例化它并将实例变量提供给 Using 为你已经完成了。出于诊断目的可以尝试几件事:(1) 看看如果将查询的 WHERE 子句从 WHERE table_name='MYTABLENAME' 更改为 WHERE ROWNUM &lt; 10 会发生什么。 (2) 如果去掉 Using command 包装器会发生什么?

标签: .net oracle


【解决方案1】:

data_default 是 Oracle 类型的 LONG。按照此文档http://docs.oracle.com/html/B14164_01/featData.htm#i1007197,您似乎需要做一些特殊的工作来检索 LONG 值。

【讨论】:

    【解决方案2】:

    我最终创建了一个 Oracle 函数来处理这个问题:

    CREATE OR REPLACE 
      FUNCTION GetColumnDefaultValue(
        TableName IN varchar2,
        ColumnName IN varchar2
      )
      RETURN varchar2
        AS ddLong long; 
        BEGIN
          SELECT data_default
          INTO ddLong
          FROM user_tab_columns
          WHERE table_name = TableName
            AND column_name = ColumnName;
        RETURN
          substr(ddLong,0,255);
        END;
    

    使用以下方法检索默认值:

    SELECT GetColumnDefaultValue('TABLENAME','FIELDNAME') FROM dual
    

    请注意,这仅检索默认值的第一个字节。修改substr(ddLong,0,255);返回更多。

    【讨论】:

    • @Colin'tHart 我不是 Oracle 专家,但我在网上看到的是字符串函数可以用于 PLSQL 中的长字段。我已经测试过这个功能,它确实有效。我还在.NET中找到了一个低级方法来确定user_tab_columns的哪些data_default字段不为空,所以我只需要对那些字段使用这个函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2015-02-26
    • 2016-05-14
    相关资源
    最近更新 更多