Нулевой ввод отправить в функцию Oracle - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь передать параметр в мою функцию, но он равен нулю. Не могли бы вы проверить и держать меня в курсе, что не так с моим кодом?

string CommandStr = "BFN_HASH_PASSWORD";

using (OracleConnection conn = new OracleConnection(oradb))
using (OracleCommand cmd = new OracleCommand(CommandStr, conn))
{
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("V_INPASSWD", OracleDbType.Varchar2,ParameterDirection.Input).Value ="TEST";
    cmd.Parameters.Add("V_OUTPASSWD", OracleDbType.Varchar2,ParameterDirection.ReturnValue);
    conn.Open();
    cmd.ExecuteNonQuery();

    MessageBox.Show("hash pass:"+ cmd.Parameters["V_OUTPASSWD"].Value.ToString());
    MessageBox.Show("hash pass:" + cmd.Parameters["V_INPASSWD"].Value.ToString());
}

моя функция оракула:

FUNCTION BFN_HASH_PASSWORD(V_INPASSWD VARCHAR2) RETURN VARCHAR2 IS
        V_OUTPASSWD VARCHAR2(1000):= '';
        LN_CNT1 NUMBER := 0;
        LN_SUM  NUMBER := 0;
BEGIN
        IF V_INPASSWD IS NOT NULL THEN
                LN_CNT1 := LENGTH(RTRIM(LTRIM(V_INPASSWD)));

                FOR I IN  1 .. LN_CNT1 LOOP
                        LN_SUM := LN_SUM + ASCII(SUBSTR(UPPER(V_INPASSWD),I,1)) ;
                END LOOP;
                V_OUTPASSWD := V_INPASSWD || LN_SUM;

                insert into TEST_CSHARP(msg,d_date) values('V_OUTPASSWD:'||V_OUTPASSWD,sysdate);
                commit;

                RETURN(V_OUTPASSWD);          
        ELSE                 
                insert into TEST_CSHARP(msg,d_date) values('V_INPASSWD:'||V_INPASSWD,sysdate);
                commit;
                RETURN V_INPASSWD; 
        END IF;
END ;

вывод test_csharp такой, как показано ниже:

 msg          d_date 

V_INPASSWD: 05/03/2018 14: 05: 34

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

По совету Мардукара я включил OracleCommand.bindByName = true и определил размер varchar2, как показано ниже. после того, как эта проблема решена.

 string CommandStr = "BFN_HASH_PASSWORD";

            using (OracleConnection conn = new OracleConnection(oradb))
                    using (OracleCommand cmd = new OracleCommand(CommandStr, conn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.BindByName = true;

                        cmd.Parameters.Add("V_INPASSWD",OracleDbType.Varchar2,ParameterDirection.Input);
                        cmd.Parameters["V_INPASSWD"].Value = "test";
                        cmd.Parameters["V_INPASSWD"].Size = 1000;

                        cmd.Parameters.Add("V_OUTPASSWD", OracleDbType.Varchar2,ParameterDirection.ReturnValue);
                        cmd.Parameters["V_OUTPASSWD"].Size = 1000;

                        conn.Open();

                        cmd.ExecuteNonQuery();
                        string output = (string)cmd.Parameters["V_OUTPASSWD"].Value.ToString();

                       MessageBox.Show("hash pass:"+ output);
                       MessageBox.Show("hash pass:" + cmd.Parameters["V_INPASSWD"].Value.ToString());
                    }
0 голосов
/ 03 мая 2018

Вы должны указать своему параметру, что это выходной параметр.

cmd.Parameters.Add("V_INPASSWD", "TEST");
cmd.Parameters.Add("V_OUTPASSWD", OracleDbType.Varchar2, ParameterDirection.Output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...