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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.07.2015, 13:23   #1  
v.i.p.to is offline
v.i.p.to
Участник
 
14 / 10 (1) +
Регистрация: 24.07.2015
Доброе время суток, есть класс в методе которого реализовано серверное подключение к SQL БД.
задумка такая чтобы передать на класс запрос , отработка запроса произойдет на стороне сервера, далее результат(CCADORecordSet) возвращаться в вызываемый метод на клиенте.

Class MyConnection method CCADORecordSet()

Код:
 public static server  CCADORecordSet getRsFromQuery(str query)
  {
    str                DataSourse, user, passwd, ConnectCatalog;
    CCADOConnection    connection ;
    CCADOCommand       ccADOCommand;
    CCADORecordSet     record;
    COM                _comCN;
    COM                cmd;
    InteropPermission  _InteropPermission  = new InteropPermission(InteropKind::ComInterop);
    
    ;
	_InteropPermission.assert();
    
	connection = new CCADOConnection();
    DataSourse=XXX.XXX.XXX.XXX;
    user=sa;
    passwd=XXXXXX;
    ConnectCatalog=AX;


    try
    {
       connection.open("Provider=SQLOLEDB ;"+
            "Data Source="+DataSourse+" ;" +
            "Initial Catalog="+ConnectCatalog+" ;" +
            "uid="+user+" ; Connect Timeout=30000;" +
            "pwd="+passwd);

        _comCN = connection.connection();
        cmd = new COM("ADODB.Command");
        cmd.activeConnection(_comCN);
        cmd.CommandType(1);

        ccADOCommand= new CCADOCommand();
        ccADOCommand.commandText(query);
        ccADOCommand.activeConnection(connection);
        ccADOCommand.commandTimeout(6000);
        record = ccADOCommand.execute();
        return record;
        
	}
    catch
    {
       throw error("An Exception has occurred");
    }
    connection.close();
		
  }

далее допустим из job вызываем этот метод

Код:
static void Job8(Args _args)
{
    str            query;
    Table          _Table;
    CCADORecordSet record;
    COM            recordSet;
    
   ;
   
    query=strfmt("select * from inventjournaltable"  );

    record    = MyConnection::CCADORecordSet(query);
    recordSet = record.recordSet();

	while (!record.EOF())
	{
	_Table.clear();
	_Table.JournalID  = record.fields().itemName("JournalId").value();
	_Table.insert();
	recordSet.moveNext();
	}
	recordSet.close();

}

Выполняя Job получаю следующую ошибку.

Сбой запроса на разрешение типа "InteropPermission".
(S)\Classes\InteropPermission\demand
(S)\Classes\COM\EOF
(S)\Classes\CCADORecordSet\EOF- line 3
(C)\Jobs\Job8 - line 15


Подскажите пожалуйста в чем причина и как устранить ошибку.
Старый 24.07.2015, 18:02   #2  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Привет, форум все же больше навиженовский.
Подобные вопросы принято задавать на axforum.info
Ваша проблема, скорее всего связана с областью действия assert.

https://msdn.microsoft.com/en-us/library/bb190039.aspx

Цитата:
Declare a variable for the relevant permission class.
Create a new instance of the class.
Request permission by using the assert method on the permission class.
Revert the assertion (to limit the scope of the permission) after the CAS-enabled API has been used; optional. Permission is automatically reverted when the method finishes executing.
исходя из кода джоб валится на 15-й строке [while (!record.EOF())] внутри метода класса все отработало на ура. К этому моменту разрешение на ComInterop уже снято.. оно вообще в в области джоба не разрешено
Старый 03.08.2015, 09:38   #3  
v.i.p.to is offline
v.i.p.to
Участник
 
14 / 10 (1) +
Регистрация: 24.07.2015
я понял, спасибо.
Старый 13.08.2015, 09:47   #4  
v.i.p.to is offline
v.i.p.to
Участник
 
14 / 10 (1) +
Регистрация: 24.07.2015
Нашел решение, если кому нужно.

Код:
//Method :: executeQuery =======================================
server static ResultSet executeQuery(str sql, Connection connection = new Connection())
{
    SqlStatementExecutePermission   sqlPerm;
    Statement                       statement;
    ResultSet                       resultSet;
    ;

    sqlPerm = new SqlStatementExecutePermission(sql);
    sqlPerm.assert();

    statement = connection.createStatement();
    resultSet = statement.executeQuery(sql);

    CodeAccessPermission::revertAssert();

    return resultSet;
}



//Job :: Job_DirectSQLTest =====================================
static void Job_DirectSQLTest(Args _args)
{
    ResultSet       testRS;
    ;
    
    testRS = SQLUtility::executeQuery("select top 10 ItemId from InventTable");
    while(testRS.next())
    {
        info(testRS.getString(1));
    }
}
Старый 13.08.2015, 09:50   #5  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
+ в карму за желание поделиться найденным решением
 


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

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

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