Извлечение однопользовательских данных из базы данных Oracle в приложение Visual Studio C # - PullRequest
0 голосов
/ 18 сентября 2018

Я использую формы в 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, он каждый раз выдает исключение, говоря, что данные не найдены, тогда как этот идентификатор клиента присутствует в базе данных 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;

1 Ответ

0 голосов
/ 19 сентября 2018

Я думаю, что это просто опечатка, строка

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...