0

Oracle で次の SQL を実行すると、列のデフォルト値が正しく報告されます ('Test')。.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
4

2 に答える 2

3

data_default は Oracle 型の LONG です。このドキュメントhttp://docs.oracle.com/html/B14164_01/featData.htm#i1007197を見ると、LONG 値を取得するには特別な作業が必要なようです。

于 2013-03-29T16:15:49.183 に答える
0

これを処理するために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);より多くを返すように変更します。

于 2013-03-29T21:00:35.227 に答える