Как заполнить поле со списком, используя хранимые процедуры Oracle SQL и VB.net - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в оракуле, использую процедуру и все еще учусь, но у меня проблема, как я могу заполнить поле со списком, используя процедуру сохранения? У меня уже есть код, но когда я его запускаю, он показывает ошибку IndexOutOfRangedException, которая не обрабатывается и не удается найти столбец 1.

Вот мой код (Процедура / Oracle Sql:)

procedure cmbbox_location (o_output out o_refcur) 
as
    o_cur o_refcur;
begin
    open o_cur for
        select city_id, city_name from city;

    o_output := o_cur;
end cmbbox_location;

(программа / vb.net)

Private Sub Main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    instantiate_dev()
    ora_conn.Open()
    populate_cmbbox_loc()
End Sub

Private Sub populate_cmbbox_loc()
    instantiate_dev()
    ora_conn.Open()
    qr.populate_location()
    cmblocation.DataSource = dt
    cmblocation.ValueMember = dt.Columns(0).ColumnName
    cmblocation.DisplayMember = dt.Columns(1).ColumnName
    cmblocation.Text = ""
    cmblocation.SelectedIndex = 0
End Sub

Public Function populate_location()
    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

1 Ответ

0 голосов
/ 15 мая 2018

Ошибка, которую вы получаете, указывает на то, что вы индексируете что-то, что не существует, возможно / вероятно, ваша хранимая процедура ничего не возвращает.Чтобы ответить на беспокойство Уильяма Робертсона относительно курсора 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...