Вызов функции PL_SQL изнутри c # - PullRequest
0 голосов
/ 09 ноября 2018

Я создал функцию 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;

примечание - мой источник данных - поставщик данных платформы .NET для oracle, а ответ - для odp.net

1 Ответ

0 голосов
/ 09 ноября 2018

Ваша функция имеет два входных параметра, поэтому ваш вызов также должен определить два входных параметра плюс возвращаемый параметр.Метод 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;";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...