【问题标题】:Retrieve single user data from oracle database into visual studio C# application从 oracle 数据库中检索单个用户数据到 Visual Studio C# 应用程序
【发布时间】:2018-09-18 14:23:30
【问题描述】:

我在 Visual Studio 中使用表单来创建应用程序,然后从 Oracle 数据库中检索数据。除了为单个用户获取数据外,我的所有部分都在工作。这是该部分的 form.cs 部分

private void getCustomerStringToolStripMenuItem_Click(object sender, EventArgs 
e)
    {
        Getcuststring g = new Getcuststring();
        g.Show();
    }

这是我的部分类,名为 getcuststring.cs

namespace Assignment
{
public partial class Getcuststring : Form
{
    public Getcuststring()
    {
        InitializeComponent();
    }

    private void Getcuststring_Load(object sender, EventArgs e)
    {

    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        Getting();
    }

    public void Getting()
    {
        OracleConnection conn = new OracleConnection();


        conn.ConnectionString = "Data Source=(DESCRIPTION =" + "(ADDRESS = (PROTOCOL = TCP)" +
            "(HOST = *******)(PORT = 1521))" + "(CONNECT_DATA =" + "(SID = dms)));"
            + "User Id= *****;Password= ******;";

        conn.Open();


        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;

        cmd.CommandText = "GET_CUST_STRING_FROM_DB";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("pcustid", OracleDbType.Long).Value = textBox1.Text;
        cmd.Parameters.Add("return_value", OracleDbType.Varchar2).Direction = ParameterDirection.ReturnValue;
        try
        {

            cmd.ExecuteNonQuery();
         //   string result = string.Empty;
            var result = cmd.Parameters["result_value"].Value.ToString();
            MessageBox.Show(result);
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
        }
        finally
        {
           conn.Close();
        }

    }
}

我的所有其他功能都在工作,但是在 Visual Studio 中执行此操作时,它每次都会发出异常,说没有找到数据,而该客户 ID 存在于 Oracle 数据库中,但它以某种方式没有显示结果,而是引发了异常。 那么你能告诉我我哪里错了吗,为什么他给我一个例外,说没有找到数据而数据实际存在。

这是函数

CREATE OR REPLACE FUNCTION GET_CUST_STRING_FROM_DB(pcustid NUMBER) RETURN 
VARCHAR2 AS 
vcustid NUMBER;
vcustname VARCHAR2(255);
vcustsales NUMBER;
vcuststatus VARCHAR2(255);
BEGIN
SELECT CUSTID,CUSTNAME,SALES_YTD,STATUS INTO 
vcustid,vcustname,vcustsales,vcuststatus
FROM CUSTOMER
WHERE CUSTID = pcustid;

RETURN 'CustID: ' || vcustid || ' Name: ' || vcustname || ' Status: ' || 
vcuststatus || ' SalesYTD: ' || vcustsales; 

EXCEPTION
WHEN NO_DATA_FOUND THEN
    RAISE_APPLICATION_ERROR(-20021,'Customer ID not found');
WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20000,SQLERRM);
END;

【问题讨论】:

  • 很可能问题出在函数GET_CUST_STRING_FROM_DB,请给我们看一下这个函数的代码。
  • pcustid 的数据类型真的是LONG。 Oracle 中的数据类型 LONG 已被弃用很长时间,通常在使用时会导致很多问题。
  • @WernfriedDomscheit 的 pcustid 数据类型是数字,但该选项在虚拟工作室中不可用,所以我必须使用这个
  • 你应该使用DoubleInt64,见OracleDbType Enumeration
  • 您应该将返回值作为参数集合的第一个元素。 Oracle 不使用这些名称(除非您在我认为的命令文本中指定它们)。

标签: c# oracle forms visual-studio exception-handling


【解决方案1】:

我认为这是简单的错字,行

var result = cmd.Parameters["result_value"].Value.ToString();

应该是:

var result = cmd.Parameters["return_value"].Value.ToString();

我构建了类似的案例,并在运行时得到了System.IndexOutOfRangeException。纠正错字解决了问题。对我有用的整个代码:

OracleConnection CONNECTION 
    = new OracleConnection("Data Source=XX;User Id=XX;Password=XX;");
CONNECTION.Open();
OracleCommand cmd = new OracleCommand() { Connection = CONNECTION };
cmd.CommandText = "GET_CUST_STRING_FROM_DB";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("pcustid", OracleType.Double).Value = textBox1.Text;
cmd.Parameters.Add("return_value", OracleType.VarChar, 500).Direction 
    = System.Data.ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
var result = cmd.Parameters["return_value"].Value.ToString();

Console.WriteLine(result);

CONNECTION.Close();

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 2015-11-25
    • 1970-01-01
    • 2016-10-18
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多