AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.11.2010, 12:35   #1  
Ilyaae is offline
Ilyaae
Участник
 
46 / 11 (1) +
Регистрация: 23.09.2008
запрос к базе Oracle
Все добрый день!
Есть задача с под АХ добраться к ораклу и получить некоторые данные. Все вроде получается, но как мне в запрос передать переменную?
"SELECT m,i_pr,k_pr from nsi_kr where k_pr=:k_pr order by m "
Вот полный код:
PHP код:
static server void Job_OracleOpti1(Args _args)
{
    
str dbCnnString "Provider=OraOLEDB.Oracle;" +
                      
"Password="    "bla"    ";" +
                      
"User ID="     "bla"      ";" +
                      
"Data Source=" "oracle";
    
COM cnnDB,    rstDB;
    
COM fldsfld;
    
str strSQLstrInfo;
    
int iiMax;
  
anytype adoValueFrom(COMVariant _valint _type)
    {
        switch (
_type)
        {
            
// список констант соответствует типам данных, распознаваемых ADO
            
case   5:      return _val.double();    // adDouble
            
case   6:      return _val.currency();  // adCurrency
            
case   7:      return _val.date();      // adDate
            
case  11:      return _val.boolean();   // adBoolean
            
case 202203200: return _val.bStr();      // adVarWChar, adLongVarWChar("memo")
        
}
        return 
'';
    }
    
   ;
   
cnnDB = new COM("ADODB.Connection");
   
cmd = new COM("ADODB.Command");
   
param = new COM("ADODB.Parameter");
   
param.Type(16);
   
param.Value(327);
   
cnnDB.connectionString(dbCnnString);
   
cnnDB.Open();
   
strsql "SELECT m,i_pr,k_pr from nsi_kr where k_pr=:k_pr order by m";
   
rstDB = new COM("ADODB.Recordset");
   
rstDB.open(strSQLcnnDB);
   
flds rstDB.Fields();
   
iMax flds.Count() - 1;
   while (!
rstDB.EOF())
   {
   
strInfo ='';
   for (
0<= iMax+= 1)
   {
   
fld flds.Item(i);
   
strInfo strInfo adoValueFrom(fld.value(), fld.Type())+ " ";
   }
   
info(strfmt("%1",strinfo));
   
rstDB.MoveNext();
   }

Заранее спасибо за помощь
Старый 25.11.2010, 12:47   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
формируйте запрос с помощью strFmt().
т.е. в выше случае должно быть так:
X++:
strsql = strFmt("SELECT m,i_pr,k_pr from nsi_kr where k_pr=%1 order by m",  );
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: Ilyaae (1).
Старый 25.11.2010, 13:01   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
В приведенном коде есть создание параметра, но нет добавления этого параметра в объект ADODB.Command (точнее в коллекцию Parameters этого объекта). На VBA это выглядело примерно так:
Код:
cmd.Parameters.Append param
Старый 25.11.2010, 13:03   #4  
Ilyaae is offline
Ilyaae
Участник
 
46 / 11 (1) +
Регистрация: 23.09.2008
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
В приведенном коде есть создание параметра, но нет добавления этого параметра в объект ADODB.Command (точнее в коллекцию Parameters этого объекта). На VBA это выглядело примерно так:
Код:
cmd.Parameters.Append param
Это была попытка реализвать через Parameters. Спасибо, попробую разобраться.
Старый 26.11.2010, 00:24   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
формируйте запрос с помощью strFmt().
Это не одно и тоже. В оригинальном сообщении использовались связанные переменные, которые в вашем запросе пропали.

А вообще, если по теме - то это обсуждали здесь.
Старый 26.11.2010, 09:01   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Андре Посмотреть сообщение
Это не одно и тоже. В оригинальном сообщении использовались связанные переменные, которые в вашем запросе пропали.

А вообще, если по теме - то это обсуждали здесь.
не понял о чем вы?
человеку нужно было составить запрос (в строковом виде) и подставить туда какой то свой критерий, только и всего чем Вам strFmt() для этого не угодил?

З.Ы, точнее понял о чем вы, но как мне показалось, топикстартера не интересовали связанные переменные, а интересовала возможность построения запроса
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 26.11.2010 в 09:09.
Старый 26.11.2010, 09:13   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
не понял о чем вы?
Не общаясь лично с человеком мне сложно предположить, в чем именно заключалась его задача, но в своем исходном сообщении он явно использовал связанные переменные (bind variables).

Должны ли они остаться в предложенном решении мне судить сложно, но я исхожу из того, что раз человек их использует, то он как минимум знает что это такое и для чего они нужны, а значит не случайно привел их в своем сообщении.

Про критическое влияние связанных переменных на производительность СУБД очень хорошо описано у Тома Кайта. Мнение о том, что в случае с Аксаптой все не столь однозначно я привел по ссылке.
Старый 26.11.2010, 13:47   #8  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 429 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Вот еще способ. Для NET. Работает на Ax2009 (для Ax4 тоже наверное заработает).
На клиенте (или сервере в зависимости от того где запускается), естественно, должен быть установлен oracle клиент (NET драйвер устанавливается по умолчанию).
Ну и, конечно, в References Axapt - ы должен быть прописан "System.Data.OracleClient"
X++:
static void Job32(Args _args)
{
    str  connectionstring;
    System.Data.OracleClient.OracleConnection oraDb;
    System.Data.OracleClient.OracleCommand cmd;
    System.Data.OracleClient.OracleDataReader orard;
    System.Data.OracleClient.OracleParameterCollection parameters;
    ;
    connectionstring  = "Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.10)(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = ax.domain.ru)));";
    connectionstring += "User Id = vasya_pupkin; Password = topsecret;";

    oraDb = new System.Data.OracleClient.OracleConnection(connectionstring);
    oraDb.Open();

    cmd = new System.Data.OracleClient.OracleCommand("select title from ax.empltable where emplId = :emplId", oraDb);
    
    parameters = cmd.get_Parameters();
    parameters.Add("emplId", "123");
    
    cmd.set_CommandTimeout(6000);


    orard = cmd.ExecuteReader();

    while(orard.Read())
    {
        info(orard.GetString(0));
    }

    orard.Close();
    oraDb.Close();
}

Последний раз редактировалось someOne; 26.11.2010 в 13:50.
За это сообщение автора поблагодарили: Ilyaae (1).
Теги
ado, oracle, параметры

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подключение к внешней базе ORACLE greench DAX: Программирование 2 26.08.2009 16:54
пользовательский запрос к базе данных Nikolaich DAX: Функционал 3 19.01.2009 17:20
Подключение к базе на Oracle через ADO miklenew DAX: Программирование 6 19.12.2007 15:41
Не создаются новые поля в базе Oracle Bega DAX: Администрирование 5 29.06.2006 16:51
Запрос к базе Access doo DAX: Программирование 2 21.04.2005 09:46

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:55.