7

私はこのpl/sql関数を持っていますが、それはユーザーがデータベースに存在することを検証することだけです。ユーザーが存在する場合は「Y」を返しますが、ユーザーが存在しない場合は「N」を返します。 c#のpl/sqlで返す値。

私はオラクル10gを使用しています

            CREATE OR REPLACE FUNCTION KRIST.f_Login (userName IN VARCHAR2,
                                                        password IN VARCHAR2)
            RETURN VARCHAR2 
            IS
                CURSOR USERFINDER IS
                    SELECT IdEmpleado
                    FROM EMPLEADO
                    WHERE Usuario=userName
                    AND Clave=password;
                id number;
                returnVal VARCHAR2(1);
            BEGIN
                OPEN USERFINDER;
                FETCH USERFINDER INTO id; 
                IF(id IS NULL) THEN
                    returnVal:='Y';
                    RETURN returnVal;
                END IF;
                returnVal:='N';
                RETURN returnVal;
                CLOSE USERFINDER;
            END;
            /

この関数を実行して変数で結果を取得する方法...コードはありますが機能しません

                OracleCommand cmd = new OracleCommand("krist.p_login",conn);
                cmd.CommandType = CommandType.StoredProcedure;  // use StoredProcedure with Functions as well
                OracleParameter returnVal = new OracleParameter("returnVal",null);
                OracleParameter p_one = new OracleParameter("userName","kristian");
                OracleParameter p_two = new OracleParameter("password", "kristian");
                returnVal.OracleType = OracleType.VarChar;
                returnVal.Size = 1;
                p_one.OracleType = OracleType.VarChar;
                p_two.OracleType = OracleType.VarChar;
                p_one.DbType = DbType.String;
                p_two.DbType = DbType.String;
                returnVal.DbType = DbType.String;
                returnVal.Direction = ParameterDirection.ReturnValue;
                p_one.Direction = ParameterDirection.Input;
                p_two.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(p_one);
                cmd.Parameters.Add(p_two);
                cmd.Parameters.Add(returnVal);
                cmd.ExecuteNonQuery();
                String bval = Convert.ToString(returnVal.Value);
                return bval;
4

3 に答える 3

9

次のコードは私のために働きます。
NB:pl / sqlコードは関数KRIST.f_Loginを呼び出しましたが、c#はそれをkrist.p_loginと呼びました
NB2:pl / sqlコードはVarchar2を使用しましたが、c#はvarcharを使用しました
NB3:Oracle.DataAccess.dllを使用しています
NB4:I戻り値のバッファ・サイズを1と想定しますが、別のサイズを試してください。

using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

int RETURN_VALUE_BUFFER_SIZE = 32767; 
OracleCommand cmd = new OracleCommand();
try {
    cmd.Connection = conn;
    cmd.CommandText = "KRIST.f_Login";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("returnVal", OracleDbType.Varchar2, RETURN_VALUE_BUFFER_SIZE);  
    cmd.Parameters["returnVal"].Direction = ParameterDirection.ReturnValue;

    cmd.Parameters.Add("userName", OracleDbType.Varchar2);
    cmd.Parameters["userName"].Value = "kristian";

    cmd.Parameters.Add("password", OracleDbType.Varchar2);
    cmd.Parameters["password"].Value = "kristian";

    cmd.ExecuteNonQuery();
    string bval = cmd.Parameters["returnVal"].Value.ToString();
    return bval;
} catch (Exception e) {
    // deal with exception 
} finally {
    command.Dispose();
    connection.Close();
    connection.Dispose();
}
于 2014-10-21T00:16:45.680 に答える
5

私が覚えている限り、ODP.NETを使用している場合は、最初にretValパラメーターを指定する必要があります。

ODP.NETに問題があり、指定されたパラメーター名ではなくパラメーターの順序でパラメーターをバインドしません。

したがって、順序を次のように変更するだけです。

cmd.Parameters.Add(returnVal);
cmd.Parameters.Add(p_one);
cmd.Parameters.Add(p_two);

そして私の情報源では、私が「RETURN」と呼んでいる戻りパラメータを見つけました(それがカウントされるかどうかはわかりません):

OracleParameter returnVal = new OracleParameter("RETURN",null);

haともう1つ。最後の行に到達することはありません-cuasereturnは実行を終了します。不要になったらすぐに閉じてください。

RETURN returnVal;
CLOSE USERFINDER; --<<-- won't close this cursor
于 2012-12-01T19:51:29.497 に答える
4

ODP.netは、デフォルトで順序に従ってバインドします。この動作は次のように変更できます:cmd.BindByName = true

于 2015-10-30T14:59:18.517 に答える