|  25.07.2013, 08:51 | #1 | 
| Участник | Выполнение кода на стороне SQL Server 
			
			Всем добрый день. Вопрос уже обсуждался, я нашел кучу примеров, сделал все "правильно", но проблема осталась нерешенной. На самом деле мне нужно выполнить хранимую процедуру. Но даже обычный SELECT возвращает ошибку в методе executeQuery(). AX 4.0, у меня на сервере есть админские права. Ошибка следующая: Request for the permission of type 'SqlStatementExecutePermission' failed. (S)\Classes\SqlStatementExecutePermission\demand (S)\Classes\Statement\executeQuery (C)\Jobs\sqlServerTest - line 18 X++: public static server void sqlServerTest(Args _args) { DictTable dt = new DictTable(tablenum(InventTable)); str sql = strfmt("SELECT * FROM %1 WHERE %1.DataAreaId = '%2'", dt.name(DbBackend::Sql) , curext() ); Connection conn = new Connection(); Statement stmt = conn.createStatement(); ResultSet rs; SqlStatementExecutePermission perm = new SqlStatementExecutePermission(sql); ; perm.assert(); // BP deviation documented rs = stmt.executeQuery(sql); while(rs.next()) { info(rs.getString(1)); //info(rs.getString(2)); } CodeAccessPermission::revertAssert(); info("OK"); } 
				__________________ // no comments Последний раз редактировалось dech; 25.07.2013 в 08:56. | 
|  | 
|  25.07.2013, 09:31 | #2 | 
| Участник | 
			
			У вас джоб на клиенте работает ! X++: C)\Jobs\sqlServerTest - line 18 Запускайте через меню итем или выносите код в статический метод класса. | 
|  | |
| За это сообщение автора поблагодарили: dech (1). | |
|  25.07.2013, 11:19 | #3 | 
| Участник | 
			
			Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
		 
				__________________ // no comments | 
|  | 
|  25.07.2013, 11:41 | #4 | 
| Модератор | 
				__________________ -ТСЯ или -ТЬСЯ ? | 
|  | 
|  25.07.2013, 12:28 | #5 | 
| Молодой, подающий надежды | Цитата: X++: static void JobOnServer(Args _args) { Args args; MenuFunction menuFunction; if (! isRunningOnServer()) { args = new Args(); args.parm("Message from Client"); menuFunction = ClassFactory::makeObjectOnServer(classNum(MenuFunction)); menuFunction.objectType(MenuItemObjectType::Job); menuFunction.object('JobOnServer'); menuFunction.runOn(2); menuFunction.run(args); return; } info(_args.parm()); } | 
|  | 
|  25.07.2013, 12:33 | #6 | 
| Участник | Цитата: X++: {
    str sql     = "USE otherDB EXEC storedProc parm1, parm2";
    Connection  conn    = new Connection();
    Statement   stmt    = conn.createStatement();
    ResultSet   rs;
    SqlStatementExecutePermission   perm = new SqlStatementExecutePermission(sql);
    ;
    perm.assert();
    // BP deviation documented
    rs = stmt.executeQuery(sql);
    while(rs.next())
    {
        info(rs.getString(1));
        //info(rs.getString(2));
    }
    CodeAccessPermission::revertAssert();
    info("OK");
}Последний раз редактировалось ansoft; 25.07.2013 в 12:40. | 
|  | 
|  25.07.2013, 12:55 | #7 | 
| Участник | 
			
			Проверил... не работает... видно не хочет переключать БД... оно видно и правильно по безопасности Остаеться как вариант через System.Data.SqlClient.SqlConnection... System.Data.SqlClient.SqlCommand и т.п. Последний раз редактировалось ansoft; 25.07.2013 в 12:59. | 
|  | 
|  25.07.2013, 13:13 | #8 | 
| Молодой, подающий надежды | 
			
			А через ODBCConnection тоже не работает? X++:     LoginProperty           loginProp;
    ODBCConnection          connection;
    loginProp               = new LoginProperty();
    loginProp.setServer('serverName');
    loginProp.setDatabase('databaseName');
    connection              = new ODBCConnection(loginProp);
} | 
|  | 
|  27.07.2013, 17:34 | #9 | 
| Участник | Цитата: А во вторых, если все-таки так и сделать, то: Cannot execute the required database operation. This function is no longer supported. Даже, если вмето метода executeQuery() вызвать executeUpdate(). 
				__________________ // no comments | 
|  | 
|  28.07.2013, 09:56 | #10 | 
| Участник | Цитата: 
		
			... у меня на сервере есть админские права
		
	 Цитата: 
		
			Ну во-первых надо явно в коде прописывать логин/пароль.
		
	 Если нет острой необходимости запускать вызов на сервере, то можно через классы CCADOConnection и CCADOCommand (они в стандарте клиентские). Подключиться можно куда надо и вызвать что угодно... Работает 100% в нашей системе. Возможно в строке подключения использовать Trusted connection (оно же Integrated Security=SSPI) X++: Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; На сервере работают и в пакетах выполняемых на сервере (у нас правда AX 2009 а не 4, однако указанные классы были еще и в 3) Последний раз редактировалось ansoft; 28.07.2013 в 10:02. | 
|  | 
|  28.07.2013, 23:56 | #11 | 
| ---------------- | 
			
			Во-первых, процедуры запускаются через excuteUpdate. Во-вторых, к соседней базе должен быть доступ у учетки, под которой АОС работает. А все эти какаду и одибися под такую задачу не нужны. | 
|  | 
|  29.07.2013, 09:20 | #12 | 
| Участник | Цитата: 
		
			А все эти какаду и одибися под такую задачу не нужны.
		
	 X++: Connection  conn    = new Connection();Ессно, при условии, что все права на SQL к БД настроены, т.е. есть для юзера АОСа и пусть даже для юзера из сессии которого все выполняется. | 
|  | 
|  29.07.2013, 09:29 | #13 | 
| Участник | Цитата: X++: #ODBCConnectionEntries //инициализация класса public boolean init( str _server, //имя сервера str _database, //база данных str _login, str _password ) { LoginProperty LP; str otherStr; ; LP = new LoginProperty(); otherStr = "DRIVER={SQL Server}"; otherStr += ";Trusted_Connection=No"; otherStr += strfmt(";SERVER=%1", _server); otherStr += strfmt(";DataBase=%1", _database); otherStr += strfmt(";UID=%1", _login); otherStr += strfmt(";PWD=%1", _password); LP.setOther(otherStr); odbcConnection = new OdbcConnection(LP); if (! odbcConnection) { return checkFailed("Ошибка при создании соединения"); } return true; } Последний раз редактировалось Ace of Database; 29.07.2013 в 09:34. | 
|  | 
|  29.07.2013, 09:38 | #14 | 
| Участник | Цитата: Вместо функций setServer и setDatabase надо вызывать setOther для класса LoginProperty Последний раз редактировалось Ace of Database; 29.07.2013 в 09:40. | 
|  | 
|  29.07.2013, 09:50 | #15 | 
| Участник | 
			
			Спасибо вам Ace of Database, однако я хотел бы получить ответ для цитаты... Цитата: 
		
			А все эти какаду и одибися под такую задачу не нужны.
		
	 Цитата: 
		
			одибися
		
	 X++: odbcConnection = new OdbcConnection(LP);По большому счету X++: Connection  conn    = new Connection();Последний раз редактировалось ansoft; 29.07.2013 в 11:07. | 
|  | 
|  29.07.2013, 10:22 | #16 | 
| Участник | 
			
			Извините, я просто заметил знакомые буквы, поэтому среагировал и ответил.   Глубины вопроса я не понял. Всегда пытаюсь делать тупо чтобы работало. Если по-тупому не работает, значит надо переосмыслить задачу, чтобы найти тупое решение, которое бы работало. | 
|  | 
|  29.07.2013, 10:47 | #17 | 
| Участник | Цитата:  Интерес к вопросу тем не менее остался... Последний раз редактировалось ansoft; 29.07.2013 в 10:50. | 
|  | 
|  29.07.2013, 11:35 | #18 | 
| Участник | Цитата: Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида X++: Statement.executeQuery('select count(*) from LinkedServer.DataBase.dbo.MyTable')
				__________________ - Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... | 
|  | 
|  29.07.2013, 11:48 | #19 | 
| Участник | Цитата: 
		
			Сообщение от Владимир Максимов
			   Никак. Объект Connection - это создание подключения, используя реквизиты подключения Axapta к "родной" базе данных. Т.е. заранее преднастроенных реквизитов, изменение которых "изнутри" Axapta не предусмотрено. Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида  Однако Linked-сервер не поможет решить задачу вызова хранимой процедуры с того же сервера SQL из другой БД. Можно конечна извратиться и создать в БД Аксапты хранимую процедуру и оттуда вызвать хранимую процедуру соседней базы, но проще все же какаду с одибисями. Умолкаю в этой теме... добавить нечего. Всем спасибо. | 
|  | 
|  29.07.2013, 11:58 | #20 | 
| ---------------- | 
			
			Коллеги, вы когда в ManagementStudio делаете Select Top 1000 Rows из какой-нибудь базы, у вас какой контекст БД используется?... правильный ответ "master"  То есть подключаясь к одной БД, получить данные из другой нет вообще никаких проблем, кроме прав. Аналогичная ситуация и с хранимками. ---- Например, если у вас на одном серваке рабочая база и дев база и АОСы ходят под одной учетку, то из дев приложения можно спокойно посмотреть данные в рабочей и даже добавить себя админом, ну и т.п. Последний раз редактировалось Wamr; 29.07.2013 в 12:01. | 
|  | |
| За это сообщение автора поблагодарили: Владимир Максимов (2), ansoft (1). | |
|  | 
|  Похожие темы | ||||
| Тема | Ответов | |||
| dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View | 0 | |||
| Connection к другому SQL Server | 5 | |||
| 
 |