У меня есть запрос, который отлично работает в TOAD, но при возврате результатов с помощью ADO.Net DataReader или DataAdapter/DataSet он не распознает столбец в инструкции select. См. Запрос ниже ... в столбце, о котором идет речь, есть данные, поступающие из динамической таблицы или подвыборки или того, что вы называете. Я не понимаю, почему это является проблемой в .Net:ADO.Net Не распознает колонку в инструкции выбора
Dim sql As String = String.Format("select bu.row_id, bu.name, selectedOrgs.bu_id as selectedOrg " _
& " FROM SIEBEL.s_prod_int_bu pb " _
& " INNER JOIN SIEBEL.s_bu bu on pb.bu_id = bu.row_id " _
& " LEFT OUTER JOIN (select bu_id " _
& " FROM SIEBEL.s_lit_bu " _
& " WHERE lit_id = ?) selectedOrgs on selectedOrgs.bu_id = bu.row_id " _
& " WHERE pb.prod_int_id in ('{0}') " _
& " ORDER BY bu.name ", String.Join("','", ids.ToArray()))
'We also need to add a parameter
cmd.Parameters.AddWithValue("", resourceID)
У меня есть объект OdbcCommand «CMD» и OdbcDataReader «Д-р». Я инициализирую ObcDataReader, как всегда: dr = cmd.ExecuteReader(). Но в цикле по записям (см ниже), код взрывает на извлечение «selectedOrg» столбец из SQL выше (индекс из исключения диапазона):
dr = cmd.ExecuteReader
If dr.HasRows Then
While dr.Read
Dim bu As New OrgResource
'Dim bu As New Resource
bu.ID = IIf(IsDBNull(dr.Item("row_id")), "", dr.Item("row_id"))
bu.Name = IIf(IsDBNull(dr.Item("name")), "", dr.Item("name"))
bu.Selected = False
If Not String.IsNullOrEmpty(resourceID) Then
'BOOM: Code blows up on next line
bu.Selected = Not IsDBNull(dr.Item("selectedOrg"))
End If
lRet.Add(bu)
End While
End If
Я не думаю, что это должно взорваться, поскольку SQL возвращается правильно в TOAD, а .Net должен видеть этот столбец как нормальный столбец, правильно? Я попытался заменить OdbcDataReader на комбо OdbcDataAdapter/DataSet, и он взорвался в той же области. Фактически, в окне «Часы студии», если да: ds.Tables (0) .Columns.Count, это показывает, что у меня есть только 2 столбца. (В Jerry Seinfeld голос: В чем дело с этим?)
Сведения об исключении с информацией стека трассировки:
System.IndexOutOfRangeException InnerException: Ничего Сообщение: selectedOrg Источник: System.Data StackTrace: в системе .Data.ProviderBase.FieldNameLookup.GetOrdinal (Строка FIELDNAME) в System.Data.Odbc.OdbcDataReader.GetOrdinal (строковое значение) в System.Data.Odbc.OdbcDataReader.get_Item (строковое значение) на MyNameSpace1.MyProject.MyClass. MyMethod (List`1 ids, String resourceID) в C: \ Documents and Settings \ my _username \ Мои документы \ MyProject \ MyClass.vb: строка 1088
Спасибо за помощь!
Энди
Спасибо за ответ - проблема не с IsDbNull(), хотя ... В окне Watch, если я пытаюсь смотреть на dr.Item («selectedOrg»), это дает мне сообщение что-то вроде: Исключить исключение из диапазона. В ближайшее время я получу полное сообщение об исключении. – Andy