| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			запрос к базе Oracle
			 
			
			Все добрый день! 
		
		
		
		
		
		
		
	Есть задача с под АХ добраться к ораклу и получить некоторые данные. Все вроде получается, но как мне в запрос передать переменную? "SELECT m,i_pr,k_pr from nsi_kr where k_pr=:k_pr order by m " Вот полный код: PHP код: 
	
			
	 | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 
			
			формируйте запрос с помощью strFmt(). 
		
		
		
		
		
		
			т.е. в выше случае должно быть так: X++: strsql = strFmt("SELECT m,i_pr,k_pr from nsi_kr where k_pr=%1 order by m",  );
				__________________ 
		
		
		
		
	"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Ilyaae (1). | |
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В приведенном коде есть создание параметра, но нет добавления этого параметра в объект ADODB.Command (точнее в коллекцию Parameters этого объекта). На VBA это  выглядело примерно так: 
		
		
		
		
		
		
		
	Код: cmd.Parameters.Append param  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Это была попытка реализвать через Parameters. Спасибо, попробую разобраться.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			формируйте запрос с помощью strFmt().
		
	 
А вообще, если по теме - то это обсуждали здесь.  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Ищущий знания... 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Андре
			 
 
			Это не одно и тоже. В оригинальном сообщении использовались связанные переменные, которые в вашем запросе пропали. 
		
	А вообще, если по теме - то это обсуждали здесь. человеку нужно было составить запрос (в строковом виде) и подставить туда какой то свой критерий, только и всего   чем Вам strFmt() для этого не угодил? ![]() З.Ы, точнее понял о чем вы, но как мне показалось, топикстартера не интересовали связанные переменные, а интересовала возможность построения запроса  
		
				__________________ 
		
		
		
		
		
			"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 26.11.2010 в 09:09.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Moderator 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			не понял о чем вы?
		
	 
Должны ли они остаться в предложенном решении мне судить сложно, но я исхожу из того, что раз человек их использует, то он как минимум знает что это такое и для чего они нужны, а значит не случайно привел их в своем сообщении. Про критическое влияние связанных переменных на производительность СУБД очень хорошо описано у Тома Кайта. Мнение о том, что в случае с Аксаптой все не столь однозначно я привел по ссылке.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вот еще способ. Для 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). | |