【问题标题】:how to populate combo box using stored procedure oracle sql and vb.net如何使用存储过程 oracle sql 和 vb.net 填充组合框
【发布时间】:2018-05-15 10:36:15
【问题描述】:

我是 oracle 的新手,正在使用过程并且仍在学习,但是我有一个问题,如何使用存储过程填充组合框?我已经有一个代码,但是当我运行它时,它显示错误 IndexOutOfRangedException is unhandled and Cannot find Column 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

【问题讨论】:

  • 我不知道vb.net,但o_output out o_refcur不应该是o_output out sys_refcursor吗? o_refcur 听起来不像一个类型,它听起来像一个 OUT 参数。另外你不需要o_cur,你可以直接打开o_output
  • 您使用的是 Oracle 客户端还是其他提供商?

标签: vb.net oracle


【解决方案1】:

您收到的错误表明您正在索引不存在的内容,您的存储过程可能/很可能没有返回任何内容。为了解决 William Robertson 对引用光标的担忧:

有多种方法可以输出引用光标。我用得最多的是包定义中定义的一个引用游标类型,例如:

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

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2013-07-08
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多