|  09.01.2008, 13:59 | #1 | 
| Участник | Максимальная длина символьного поля CCADOField 
			
			Мне надо через ADO подключиться к внешней базе данных Oracle (данные не связаны с Axapta) и прочитать содержимое полей. Выполняю такой код X++: static server void test_ADO() { CCADOConnection adoConnection; CCADORecordSet adoRecordSet; CCADOCommand adoCommand; CCADOFields adoFields; CCADOField adoField; ; adoConnection = new CCADOConnection(); adoConnection.open("Provider=OraOLEDB.oracle;Data Source=ХХХ;User Id=YYY;Password=ZZZ;"); adoCommand = new CCADOCommand(); adoCommand.activeConnection(adoConnection); adoCommand.commandType(1); adoCommand.commandText("SELECT MyField FROM MyTable WHERE rownum <= 1"); adoRecordSet = adoCommand.execute(); adoFields = adoRecordSet.fields(); adoField = adoFields.itemIdx(0); while (! adoRecordSet.EOF()) { print adoField.name(),"=",adoField.value(), " ", strLen(adoField.value()); adoRecordSet.moveNext(); } pause; } Как можно получить полное содержимое символьных полей без ограничения по длине? Т.е. длина может быть и более 1000 символов (мемо-поля) AXPATA 2.5 SP3 Использован драйвер "Oracle Provider for OLE DB 9.2.4.0" из пакета "Oracle9i Release 2 Provider for OLE DB Version 9.2.0.4.0 (including ODAC) 32-bit" | 
|  | 
|  09.01.2008, 19:14 | #2 | 
| Moderator | 
			
			На Axapta 3.0, SP4, OraOLEDB.dll версии 9.2.0.1, MDAC версии 2.53 - не воспроизводится.  Нормально читает всё содержимое из полей VARCHAR2(4000) и LONG. Из LONG спокойно читается строка длиной 25 тыс. символов. | 
|  | 
|  10.01.2008, 12:49 | #3 | 
| Участник | 
			
			Спасибо. Натолкнул на мысль проверить типы. Проблема оказалось только с типом LONG. Тип VarChar2 читается без проблем и ограничений. Хотя все-равно не понятно почему...
		 | 
|  | 
|  10.01.2008, 14:50 | #4 | 
| Moderator | 
			
			НА ЗАМЕТКУ: прочитал здесь http://citforum.urc.ac.ru/database/cnit/6.shtml следующее (речь о Перле): Цитата: 
		
			$ora_long Обычно Oraperl спрашивает базу данных о длине каждого поля и соответствующим образом распределяет буферное пространство. Это невозможно для полей типа LONG и LONGRAW. Распределение пространства в предположении максимально возможной длины (65535 bytes) привело бы к излишним тратам памяти. Поэтому когда &ora_open() определяет, что поле имеет тип LONG, память распределяется согласно значению переменной $ora_long. При инициализации она принимает значение 80 (для совместимости с продуктами Oracle), но в программе ее можно устанавливать произвольным образом.
		
	 | 
|  | 
|  10.01.2008, 16:48 | #5 | 
| Moderator | 
			
			Владимир, а что если из Excel такой VBA-шный "джобик" запустить, чтобы понять, в Аксапте ли дело?: Код: Sub test_ADO_onVBA()
    Dim adoConnection As Object
    Dim adoRecordSet As Object
    Dim adoCommand  As Object
    Dim adoFields As Object
    Dim adoField As Object
    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Open "Provider=OraOLEDB.oracle;Data Source=ХХХ;User Id=YYY;Password=ZZZ;"
    
    Set adoCommand = CreateObject("ADODB.Command")
    adoCommand.activeConnection = adoConnection
    adoCommand.CommandType = 1
    adoCommand.CommandText = "SELECT MyField FROM MyTable WHERE rownum <= 1"
    Set adoRecordSet = adoCommand.Execute
    Set adoFields = adoRecordSet.fields
    Set adoField = adoFields.Item(0)
    While Not adoRecordSet.EOF
        Debug.Print adoField.Name, "=", adoField.Value, " ", Len(adoField.Value)
        adoRecordSet.moveNext
    Wend
    
End Sub P.S. Ну и заодно попробовать "Provider=MSDAORA" , чтобы убедиться, в провайдере ли дело. | 
|  | 
|  11.01.2008, 11:32 | #6 | 
| Участник | 
			
			Проверил. С Excel та же проблема. Тип Long обрезается до 100 символов, а VarChar2 - без ограничений MDAC_Checker показыват что установлен MDAC 2.8 SP2 А вот драйвер от Microsoft берет нормально. Ничего не обрезает. Т.е. однозначно проблема с драйвером. Что ж, по крайней мере, выяснили причину. Спасибо. Хотя оракловая версия дравера и постарше 9.2.0.4, но работает хуже   Последний раз редактировалось Владимир Максимов; 11.01.2008 в 11:50. | 
|  |