使用Odbc.NET调用Oracle Procedure

时间:2014-03-15 09:22:06

标签: c# sql oracle stored-procedures

我正在使用oracle的ODBC驱动程序与Oracle服务器进行通信。 我的程序如下。

PROCEDURE USP_ValidateLogin
(
    LoginID                    IN       VARCHAR DEFAULT null,
    Password                   IN       VARCHAR DEFAULT null,
    RCT1                        IN  OUT     GLOBALPKG.RCT1
)
AS  
    BEGIN 

        OPEN RCT1 FOR 
        SELECT
                 EMP.EMPID,
                 EMP.EMPNAME,
                 EMP.DESIGNATION
        FROM  SYSTEMUSERS LUSR,
             EMPLOYEE EMP,
            (   SELECT *
            FROM  PRIVILEGELEVEL PLVL 
            WHERE    PLVL.ALLOWEDMENUOPTION  = 'mnuDoctorDesk'
        ) PLVL 
        WHERE    LUSR.USERID  = EMP.LOGINID (+)
         AND    (EMP.DESIGNATION  = PLVL.PRIVILEGELEVEL (+))
         AND    (LUSR.USERID  = USP_ValidateLogin.LoginID
         AND    LUSR.PASSWORD  = USP_ValidateLogin.Password);
    END;

我的主叫代码写在下面,

private void button1_Click(object sender, EventArgs e)
{
    string sqlCon = "Driver={Oracle in OraHome90};Dbq=DRDESK;Uid=scott;Pwd=tiger;";
    ConnectionString = sqlCon;
    OdbcParameter[] SqlParams = new OdbcParameter[3];

    OdbcParameter SqlInputParam = new OdbcParameter();
    SqlInputParam = SetParameter("LoginID", OdbcType.VarChar, 50, ParameterDirection.Input, "DRKEETHI");
    SqlParams[0] = SqlInputParam;

    SqlInputParam = new OdbcParameter();
    SqlInputParam = SetParameter("Password", OdbcType.VarChar, 50, ParameterDirection.Input, "123");
    SqlParams[1] = SqlInputParam;

    SqlInputParam = SetParameter("RCT1", OdbcType.VarChar, 50, ParameterDirection.Output, "123");//new OdbcParameter("RCT1", "");
    SqlParams[2] = SqlInputParam;

    DataTable dtUserRight = GetDataTableFromProcedure("USP_ValidateLogin", true, SqlParams);
    dataGridView1.DataSource = dtUserRight;
}

public static DataTable GetDataTableFromProcedure(string CmdText, bool isParams, OdbcParameter[] sqlParams)
{
    OdbcCommand sqlCmd = new OdbcCommand();

    SetCommandType(sqlCmd, CommandType.StoredProcedure, GenerateProcedureCallString(CmdText, sqlParams.Length));

    if (isParams)
    {
        AddParamToSQLCmd(sqlCmd, sqlParams);
    }

    DataTable objDt = new DataTable();
    objDt = FillDataTable(sqlCmd);
    return objDt;
}


private static DataTable FillDataTable(OdbcCommand sqlCmd)
{
    OdbcConnection SqlCon = new OdbcConnection();
    DataTable tblResult = new DataTable();
    OdbcDataAdapter _OdbcDataAdapter = new OdbcDataAdapter();

    SqlCon = OpenConnection();
    sqlCmd.Connection = SqlCon;
    _OdbcDataAdapter.SelectCommand = sqlCmd;
    _OdbcDataAdapter.Fill(tblResult);

    return tblResult;
}

但按下按钮时出现此错误。

ERROR [HY000] [Oracle][ODBC][Ora]ORA-06553: PLS-306: wrong number or types of arguments in call to 'USP_VALIDATELOGIN'

at

_OdbcDataAdapter.Fill(tblResult);

我认为此错误是由存储过程的OUT参数的数据类型引起的。 任何人都可以纠正这个吗?

PS:如果我使用

SqlInputParam = new OdbcParameter("RCT1", null);
SqlInputParam.Direction = ParameterDirection.Output;

而不是

SqlInputParam = SetParameter("RCT1", OdbcType.VarChar, 50, ParameterDirection.Output, "123");
SqlParams[2] = SqlInputParam;

我收到错误,

String[3]: the Size property has an invalid size of 0.

0 个答案:

没有答案