2009-10-07 3 views
1

У меня есть запрос, который отлично работает в 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

Спасибо за помощь!

Энди

ответ

1

Edit: После трассировки стека добавил

@Andy, достаточно точно ... что ошибка означает, что столбец selectedOrg не был признан в качестве действительного столбца. В вашем коде ничего не происходит, как очевидная ошибка. Но вот что попробовать.

Изменить эту линию ...

bu.Selected = Not IsDBNull(dr.Item("selectedOrg")) 

... к этому ...

bu.Selected = Not IsDBNull(dr("selectedOrg")) 

Это работает для меня в прошлом.

+0

Спасибо за ответ - проблема не с IsDbNull(), хотя ... В окне Watch, если я пытаюсь смотреть на dr.Item («selectedOrg»), это дает мне сообщение что-то вроде: Исключить исключение из диапазона. В ближайшее время я получу полное сообщение об исключении. – Andy

0

Попробуйте отказаться от указателя «как» для выбранного столбцаOrgs.bu_id. Я не думаю, что Oracle использует его, и это может привести к тому, что переводчик ODBC задохнется.

из
'selectedOrgs.bu_id в selectedOrg'

к
'selectedOrgs.bu_id selectedOrg'

+0

Спасибо за ответ, но это не так. Мы используем «как» в другом месте, как полевые псевдонимы с успехом. – Andy

+0

ОК, затем взгляните на переменную «sql». Вытяните оператор «подвыбор» и запустите его, чтобы убедиться, что он что-то возвращает. – Jim

0

я в конечном итоге удаление "LEFT OUTER JOIN (выберите ...)" часть SQL и просто выполнение двух операторов один за другим. Я предполагаю, что это ошибка в System.Data.Odbc имен. Не уверен, что это происходит в System.Data.SqlClient или System.Data.OracleClient.

Спасибо за ответы.

Энди

Смежные вопросы