| 
	 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У вас джоб на клиенте работает ! 
		
		
		
		
		
		
		
	X++: C)\Jobs\sqlServerTest - line 18 Запускайте через меню итем или выносите код в статический метод класса.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: dech (1). | |
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо большое. А как теперь выполнить хранимую процедуру, которая работает с другой базой данных на том же SQL Server? Пишет ошибку.
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	// no comments  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		
		
		
		
		
		
		
			 
				__________________ 
		
		
		
		
	-ТСЯ или -ТЬСЯ ?  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
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.  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Молодой, подающий надежды 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
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()); }  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Проверил... не работает... видно не хочет переключать БД... оно видно и правильно по безопасности 
		
		
		
		
		
		
		
		
			Остаеться как вариант через System.Data.SqlClient.SqlConnection... System.Data.SqlClient.SqlCommand и т.п. Последний раз редактировалось ansoft; 25.07.2013 в 12:59.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Молодой, подающий надежды 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А через ODBCConnection тоже не работает? 
		
		
		
		
		
		
			
		
		
		
		
	X++:     LoginProperty           loginProp;
    ODBCConnection          connection;
    loginProp               = new LoginProperty();
    loginProp.setServer('serverName');
    loginProp.setDatabase('databaseName');
    connection              = new ODBCConnection(loginProp);
} | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
А во вторых, если все-таки так и сделать, то: Cannot execute the required database operation. This function is no longer supported. Даже, если вмето метода executeQuery() вызвать executeUpdate(). 
				__________________ 
		
		
		
		
	// no comments  | 
| 
	
 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Во-первых, процедуры запускаются через excuteUpdate. 
		
		
		
		
		
		
		
	Во-вторых, к соседней базе должен быть доступ у учетки, под которой АОС работает. А все эти какаду и одибися под такую задачу не нужны.  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			А все эти какаду и одибися под такую задачу не нужны.
		
	 
X++: Connection  conn    = new Connection();Ессно, при условии, что все права на SQL к БД настроены, т.е. есть для юзера АОСа и пусть даже для юзера из сессии которого все выполняется.  | 
| 
	
 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Вместо функций setServer и setDatabase надо вызывать setOther для класса LoginProperty Последний раз редактировалось Ace of Database; 29.07.2013 в 09:40.  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида X++: Statement.executeQuery('select count(*) from LinkedServer.DataBase.dbo.MyTable')
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Владимир Максимов
			 
 
			Никак. Объект Connection - это создание подключения, используя реквизиты подключения Axapta к "родной" базе данных. Т.е. заранее преднастроенных реквизитов, изменение которых "изнутри" Axapta не предусмотрено. 
		
	Единственное, что можно сделать, это использовать Linked-сервера. Тогда надо писать запросы вида ![]() Однако Linked-сервер не поможет решить задачу вызова хранимой процедуры с того же сервера SQL из другой БД. Можно конечна извратиться и создать в БД Аксапты хранимую процедуру и оттуда вызвать хранимую процедуру соседней базы, но проще все же какаду с одибисями. Умолкаю в этой теме... добавить нечего. Всем спасибо.  | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо вам Ace of Database, однако я хотел бы получить ответ для цитаты... 
		
		
		
		
		
		
		
		
			Цитата: 
	
		
			А все эти какаду и одибися под такую задачу не нужны.
		
	 
Цитата: 
	
		
			одибися
		
	 
X++: odbcConnection = new OdbcConnection(LP);По большому счету X++: Connection  conn    = new Connection();Последний раз редактировалось ansoft; 29.07.2013 в 11:07.  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Извините, я просто заметил знакомые буквы, поэтому среагировал и ответил.  
		
		
		
		
		
		
		
	  Глубины вопроса я не понял. Всегда пытаюсь делать тупо чтобы работало. Если по-тупому не работает, значит надо переосмыслить задачу, чтобы найти тупое решение, которое бы работало.
		 | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
![]() Интерес к вопросу тем не менее остался... Последний раз редактировалось ansoft; 29.07.2013 в 10:50.  | 
| 
	
 | 
| 
			
			 | 
		#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 | |||
		
  |