【问题标题】:Calling a PL_SQL function from inside c#从 C# 内部调用 PL_SQL 函数
【发布时间】:2021-02-25 23:42:17
【问题描述】:

我创建了一个 PL/SQL 函数并将其存储在我的 oracle 数据库中。现在我想在单击按钮时调用该函数。 我正在使用 Visual Studio 和 C#。

我卑微的尝试-

private void button3_Click(object sender, EventArgs e)
{
    comm = new OracleCommand();
    comm.CommandType = CommandType.StoredProcedure;
    comm.Connection = conn;
    String x1 = textBox1.Text;
    String x2 = textBox2.Text;

    comm.CommandText = "log_in";
    comm.Parameters.Add(new OracleParameter("c", OracleDbType.Varchar2, textBox1.Text, ParameterDirection.Input));
    comm.Parameters.Add(new OracleParameter("tt", OracleDbType.Varchar2, 256, ParameterDirection.ReturnValue));
    String z = comm.Parameters["z"].Value.ToString();
    comm.ExecuteNonQuery();
    if (z.Equals('1'))
    { MessageBox.Show("correct"); }
    conn.Close();
}

PL/SQL-

CREATE OR REPLACE FUNCTION log_in
(
    x IN VARCHAR2,
    y IN VARCHAR2
) RETURN VARCHAR2 AS
    match_count NUMBER;
BEGIN
    SELECT COUNT(*)
    INTO match_count
    FROM student_login
    WHERE email = x
    AND password = y;
    IF match_count = 0 THEN
        RETURN 0;
    ELSE
        RETURN 1;
    END IF;
END;

注意-我的数据源是 oracle 的 .NET 框架数据提供者,答案是 odp.net

【问题讨论】:

  • 那有什么问题?
  • 当我点击按钮时表单关闭
  • 我也只是在寻找一个一般性的答案...它可能不是针对这个问题...以更容易的为准
  • 您是否尝试过设置断点并找出String Z 的值?它甚至达到那个地步吗?表单关闭的原因有很多,因此更多地了解事物的价值会有所帮助。
  • 函数有两个参数。你只传递一个输入

标签: c# oracle visual-studio oracle11g


【解决方案1】:

您的函数有两个输入参数,因此您的调用还必须定义两个输入参数和返回参数。方法Add(OracleParameter) 是可能的,但是是多余的。

应该是这样的:

comm = new OracleCommand();
comm.CommandType = CommandType.StoredProcedure;
comm.Connection = conn;

comm.CommandText = "log_in";
comm.Parameters.Add("x", OracleDbType.Varchar2, ParameterDirection.Input).Value = textBox1.Text; 
   // As far as I remember "ParameterDirection.Input" is the default, so you may skip it
comm.Parameters.Add("y", OracleDbType.Varchar2, ParameterDirection.Input).Value = textBox2.Text;
comm.Parameters.Add("ret", OracleDbType.Byte, ParameterDirection.ReturnValue);
comm.Parameters["ret"].DbType = DbType.Byte;
comm.ExecuteNonQuery();

String returnValue = comm.Parameters["ret"].Value.ToString();

其实我从来没有用过CommandType.StoredProcedure。如果上面的代码不起作用,请尝试以下代码:

comm.CommandType = CommandType.Text;
comm.CommandText = "BEGIN :ret := log_in(:x, :y); END;";

【讨论】:

    【解决方案2】:

    您好,我在使用 StoredProcedure 时遇到了一些问题。最后让它发挥作用。

    comm = new OracleCommand();
    comm.CommandType = CommandType.StoredProcedure;
    comm.Connection = conn;
    
    comm.CommandText = "log_in";
    // Important is to add returnValue as described bellow
    OracleParameter retval = new OracleParameter("ret", OracleDbType.Varchar2 , 20);
    retval.Direction = ParameterDirection.ReturnValue;
    comm.Parameters.Add(retval);
    comm.Parameters.Add("x", OracleDbType.Varchar2, ParameterDirection.Input).Value = textBox1.Text; 
    comm.Parameters.Add("y", OracleDbType.Varchar2, ParameterDirection.Input).Value = textBox2.Text;
    comm.ExecuteNonQuery();
    
    String returnValue = comm.Parameters["ret"].Value.ToString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-05
      • 2021-10-15
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2020-08-26
      相关资源
      最近更新 更多