Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ADO и большие числа из Oracle  [new]
Wasup!
Member

Откуда:
Сообщений: 184
Столкнулся с проблемой. Не получается достать из Oracle большие числа, через ado с использованием oledb провайдера (MSDAORA или OraOLEDB).
При вставке из рекордсета получаю ошибку "-2147217887 Произошли ошибки при выполнении многошаговых операций. Проверьте значения всех состояний." или вообще ничего не получаю.
Предполагаю, что проблема в том что тип этого числа в рекордсете определяется, как adVarNumeric, что соответствует Variant/Decimal. Этот тип по определению не может сохранить число 1234E35, оно слишком большое. Нужно использовать Double.
Можно ли как то управлять типом столбца в рекордсете? Или проблема связана с какими-то глюками у меня, а у всех работает нормально?

Код для VBA
Option Explicit

Public cnn As Object
Public rs As Object

Const adUseClient As Long = 3
Const adOpenStatic As Long = 3
Const adLockReadOnly As Long = 1
Const adPersistXML As Long = 1

Sub Main()
Dim strCnnStr As String
Dim dblTmp As Double
Dim avarTmp() As Variant
Dim strTmp As String

Set cnn = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.recordset")
'strCnnStr = "Provider=OraOLEDB.Oracle;Data Source=;User ID=;Password="
strCnnStr = "Provider=MSDAORA;Data Source=;User ID=;Password="

cnn.CursorLocation = adUseClient
cnn.Open strCnnStr

rs.Open "select 1234E35+1 as num,to_char(1234E35+1,'TM') as chr from dual", cnn, adOpenStatic, adLockReadOnly

'Поле num будет пропущено
ThisWorkbook.Worksheets(1).Cells(1, 1).CopyFromRecordset rs

'А в гриде оно видно!
Set Form1.MSHFlexGrid1.DataSource = rs
Form1.Show

'В массиве поле num имеет значение Empty
rs.MoveFirst
avarTmp = rs.GetRows
'тоже пропускает поле num
rs.MoveFirst
strTmp = rs.GetString
'А в файл это поле сохраняется правильно!
On Error Resume Next
rs.Save "c:\numtestrs.xml", adPersistXML
'напрямую присваивание тоже не проходит
rs.MoveFirst
dblTmp = rs.Fields(0).Value
Debug.Print dblTmp, "И почему в одном случае из рекордсета можно получить значение, а в другом нет?"

rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing

End Sub
19 янв 07, 14:26    [3667240]     Ответить | Цитировать Сообщить модератору
 Re: ADO и большие числа из Oracle  [new]
Oleg Ivanov
Member

Откуда: Киев
Сообщений: 289
Тип поля должен быть BCD, а не integer.
19 янв 07, 14:45    [3667383]     Ответить | Цитировать Сообщить модератору
 Re: ADO и большие числа из Oracle  [new]
Wasup!
Member

Откуда:
Сообщений: 184
Не совсем понял, тип какого поля, в базе или в рекордсете?
19 янв 07, 16:39    [3668283]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить