Значение по умолчанию для столбца типа Oracle DATE не возвращается ODP в c # - PullRequest
0 голосов
/ 05 июля 2018

Я подключаюсь к базе данных oracle через c # и управляемый OPD. Я получаю все столбцы таблицы, но не могу получить значение по умолчанию для столбцов типа DATE. Я должен отметить, что когда я выполняю тот же запрос в Oracle SQL Developer, он показывает значение по умолчанию для определенного столбца.

мой код:

    public DataTable SelectIntoTable(DbCommand cmd, params object[] values)
    {
        if (!SetParamsValues(cmd, values))
            return null;

        DataSet dataSet = new DataSet();
        DataTable table = new DataTable();
        DbDataAdapter adapter = MakeDataAdapter();
        adapter.AcceptChangesDuringFill = false;
        adapter.SelectCommand = cmd;
        LastException = null;
        try
        {
            if (Type == DataSource.DBSourceType.ORACLE)
            {
                adapter.Fill(dataSet);
                table = dataSet.Tables[0];
            }
            else
            {
                adapter.Fill(table);
            }
        }
        catch (Exception exp)
        {
            OnErrorOccured(exp, cmd);
            table = null;
        }

        return table;
    }

мой запрос:

SELECT COLUMN_ID, COLUMN_NAME, TABLE_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT, IDENTITY_COLUMN
                FROM user_tab_columns WHERE TABLE_NAME IN ('GPS') ORDER BY TABLE_NAME ASC, COLUMN_ID ASC;

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

DATA_DEFAULT столбец имеет тип LONG, который в ODP имеет длину 0 по умолчанию. Мы должны изменить это с помощью этой команды (измените значение InitialLONGFetchSize на что угодно, кроме 0):

cmd.InitialLONGFetchSize = -1;

0 голосов
/ 05 июля 2018

Тип данных DATA_DEFAULT - LONG, с которым всегда трудно работать, поскольку он устарел на века и вряд ли поддерживается какой-либо функцией.

Вы можете написать функцию, подобную этой, чтобы получить значение. Однако вы должны написать несколько функций, возвращающих разные типы данных, и вызывать их на основе значения DATA_TYPE

CREATE OR REPLACE FUNCTION DATE_Default(tabName IN VARCHAR2, colName IN VARCHAR2) RETURN DATE AS 
    res DATE;
BEGIN

    FOR aVal IN (SELECT DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME = tabName AND COLUMN_NAME = colName) LOOP
        EXECUTE IMMEDIATE 'BEGIN :res := '||aVal.DATA_DEFAULT||'; END;' USING OUT res;
    END LOOP;
    RETURN res;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...