C # + Pl / SQL Проблема с параметром out в хранимой процедуре - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть хранимая процедура, которая выглядит следующим образом:

CREATE OR REPLACE PROCEDURE
Get_Username
(
    p_Username IN user.USERNAME%TYPE,
    p_ReturningUsername OUT user.Username%TYPE
)
IS
BEGIN
    SELECT username INTO p_ReturningUsername FROM user WHERE p_Username = username;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        p_ReturningUsername := null;
END;

Я выполнил его из базы данных, и он отлично работал. Когда я запускаю его из приложения c #, я не получаю никакого значения обратно.

public bool getUsername(string username)
    {
        OracleConnection connection = getConnection();
        OracleCommand oracleCommand = new OracleCommand("Get_Username", connection);
        oracleCommand.CommandType = CommandType.StoredProcedure;
        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2).Direction = ParameterDirection.Output;
        oracleCommand.Parameters.Add("p_Username", OracleDbType.Varchar2).Value = username;

        try
        {
            oracleCommand.ExecuteNonQuery();
        }
        catch (OracleException ex)
        {
            MessageBox.Show("Exception Message: " + ex.Message);
            MessageBox.Show("Exception Source: " + ex.Source);
        }


        string tmp = oracleCommand.Parameters["p_ReturningUsername"].Value.ToString();
        connection.Close();
        return tmp == username;
    }

В окне регистрации WPF мне нужно проверить, не занято ли уже имя пользователя. Когда я выполняю этот код, я получаю пустую строку, когда это должно быть имя пользователя в пользовательской таблице.

Пожалуйста, помогите мне, спасибо заранее.

Ответы [ 2 ]

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

Как говорит @Codo, добавьте строку command.BindByName = true;, но также замените строку

        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

на

        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2, 100, null, ParameterDirection.Output);

Замените число 100 на количество символовв вашем username столбце.

Мы используем эту перегрузку метода Add, чтобы мы могли указать размер выходного параметра.Это позволяет драйверу Oracle освободить достаточно места для получения значения из базы данных.Аргумент null предназначен для начального значения параметра, который нас не волнует, потому что это выходной параметр, но мы должны указать его, так как нет перегрузки метода Add, который принимает только имя, тип, размер и направление.

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

Попробуйте этот код (я только что поменял две строки):

public bool getUsername(string username)
    {
        OracleConnection connection = getConnection();
        OracleCommand oracleCommand = new OracleCommand("Get_Username", connection);
        oracleCommand.CommandType = CommandType.StoredProcedure;
        oracleCommand.Parameters.Add("p_Username", OracleDbType.Varchar2).Value = username;
        oracleCommand.Parameters.Add("p_ReturningUsername", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

        try
        {
            oracleCommand.ExecuteNonQuery();
        }
        catch (OracleException ex)
        {
            MessageBox.Show("Exception Message: " + ex.Message);
            MessageBox.Show("Exception Source: " + ex.Source);
        }


        string tmp = oracleCommand.Parameters["p_ReturningUsername"].Value.ToString();
        connection.Close();
        return tmp == username;
    }

Или добавить:

oracleCommand.BindByName = true;

По умолчанию класс OracleCommand связывает параметры по порядку, а не по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...