Oracle Managed Data Reader возвращает DBNull для одной таблицы базы данных - PullRequest
1 голос
/ 14 марта 2019

Проблема:

Я использую клиент доступа к управляемым данным Oracle для подключения к базе данных Oracle eBS.При выборе значения из одной таблицы я получаю результат;при изменении таблицы я получаю нулевое значение.

Справочная информация:

В моем клиенте SQLDeveloper я могу подключиться к базе данных и выполнить следующие запросы:

SELECT MSIB.SEGMENT1 
FROM APPS.MTL_SYSTEM_ITEMS_B MSIB 
WHERE MSIB.ORGANIZATION_ID = 255 AND MSIB.SEGMENT1 = '03F.211';
-- 1 ROW RETURNED - VALUE OF 03F.211

SELECT MC.SEGMENT1 
FROM APPS.MTL_CATEGORIES_VL MC 
WHERE MC.SEGMENT1 = 'A0042I';
-- 1 ROW RETURNED - VALUE OF A0042I

Затемв C # я подключаюсь к базе данных с точно такими же учетными данными (поэтому это не должно быть проблемой с разрешениями базы данных).

При выполнении этого кода я получаю окно сообщения, возвращающее то, что я ожидал: 03F.211

 OracleConnection oradbcon = new OracleConnection(strOracleConString);
 oradbcon.Open();
 strQuery = "SELECT MSIB.SEGMENT1 FROM APPS.MTL_SYSTEM_ITEMS_B MSIB WHERE MSIB.ORGANIZATION_ID = 255 AND MSIB.SEGMENT1 = " + ":ITEM_CODE";
 // strQuery = "SELECT MC.SEGMENT1 FROM APPS.MTL_CATEGORIES_VL MC WHERE MC.SEGMENT1 = " + ":ITEM_CODE";
 OracleCommand oradbcmd = new OracleCommand(strQuery, oradbcon);
 oradbcmd.CommandType = CommandType.Text;
 OracleParameter p_item_code = new OracleParameter();
 p_item_code.OracleDbType = OracleDbType.Varchar2;
 p_item_code.Value = "03F.211";
 // p_item_code.Value = "A0042I";
 oradbcmd.Parameters.Add(p_item_code);
 OracleDataReader oradbdr = oradbcmd.ExecuteReader();
 oradbdr.Read();
 strProductMinor = oradbdr.GetString(0).ToString();
 MessageBox.Show(strProductMinor);

Но при выполнении кода с этими закомментированными строками я получаю сообщение об ошибке, указывающее, что база данных пуста:

OracleConnection oradbcon = new OracleConnection(strOracleConString);
oradbcon.Open();
// strQuery = "SELECT MSIB.SEGMENT1 FROM APPS.MTL_SYSTEM_ITEMS_B MSIB WHERE MSIB.ORGANIZATION_ID = 255 AND MSIB.SEGMENT1 = " + ":ITEM_CODE";
strQuery = "SELECT MC.SEGMENT1 FROM APPS.MTL_CATEGORIES_VL MC WHERE MC.SEGMENT1 = " + ":ITEM_CODE";
OracleCommand oradbcmd = new OracleCommand(strQuery, oradbcon);
oradbcmd.CommandType = CommandType.Text;
OracleParameter p_item_code = new OracleParameter();
p_item_code.OracleDbType = OracleDbType.Varchar2;
// p_item_code.Value = "03F.211";
p_item_code.Value = "A0042I";
oradbcmd.Parameters.Add(p_item_code);
OracleDataReader oradbdr = oradbcmd.ExecuteReader();
oradbdr.Read();
strProductMinor = oradbdr.GetString(0).ToString();
MessageBox.Show(strProductMinor);

DbNull Error

Что может заставить один запрос возвращать результаты, а другой - нет?

(И наконец - простите мое незнание C #, если что-то выше уродливо. Годы опыта Oracle - первая программа на C #когда-либо ... :))

1 Ответ

0 голосов
/ 14 марта 2019

Проблема заключается в языке.

APPS.MTL_CATEGORIES_VL - это представление, в определении которого есть другое представление: MTL_CATEGORIES_TL

Представления, оканчивающиеся на TL, являются «переведенным языком», то есть они только возвращают результатыдля языка сеанса базы данных.

Разработчик SQL объявляет язык по умолчанию при подключении.Клиент .NET не является.

Мне нужно либо выяснить, как объявлять язык, либо переписать мои запросы, чтобы использовать базовые таблицы без языка.

Редактировать: Быложалоба, что это был не фактический ответ, а объяснение.

Вот фактический код, который является ответом:

    try // Open Connection
    {
        oradbcon = new OracleConnection(yourConnectionStringHere);
        oradbcon.Open();
        OracleGlobalization orainfo = oradbcon.GetSessionInfo();
        orainfo.Language = "AMERICAN"; // Explicitly Set Language
        oradbcon.SetSessionInfo(orainfo);
    }
...