Ошибка, которую вы получаете, указывает на то, что вы индексируете что-то, что не существует, возможно / вероятно, ваша хранимая процедура ничего не возвращает.Чтобы ответить на беспокойство Уильяма Робертсона относительно курсора ref:
Существует несколько способов вывести курсор ref.Больше всего я использую тип курсора ref, определенный в определении пакета, например:
CREATE OR REPLACE PACKAGE Location_Package IS
TYPE DataOutCursor IS REF CURSOR;
procedure cmbbox_location (o_output out DataOutCursor);
END Location_Package;
/
Затем в процедуре в теле пакета:
CREATE OR REPLACE PACKAGE BODY Location_Package IS
procedure cmbbox_location (o_output out DataOutCursor) as
begin
open o_output for
select city_id, city_name from city;
end;
END;
/
Я предполагаю, чтоздесь происходит ошибка:
cmblocation.ValueMember = dt.Columns(0).ColumnName
cmblocation.DisplayMember = dt.Columns(1).ColumnName
Всегда лучше сначала убедиться, что в таблице данных есть данные, поэтому оберните строки поля со списком:
IF dt.Rows.Count > 0 Then
' ..... assign the data table to the combo box
Else
' Some error message ...
End IF
Это избавит отнеобработанное исключение и поможет вам разобраться в проблеме.
В заключение, ваша функция должна вернуть значение (с датой):
Public Function populate_location() as Datatable
dt = New DataTable
bg.GetProcDataTable(connStr, "Location_Package.cmbbox_location")
cmd.Parameters.Add(New OracleParameter("O_OUTPUT", OracleDbType.RefCursor)).Direction = ParameterDirection.Output
adap_or.SelectCommand = cmd
adap_or.Fill(dt)
Return dt
ora_conn.Close()
End Function