0

次のように、1 つの in パラメータと 1 つの out パラメータを持つストアド プロシージャがあります。

create or replace procedure worker_name (w_id in number, w_first out worker.first_name%type) is

Begin
  select first_name into w_first
  from worker
  where worker_id = w_id;
end;

このストアド プロシージャを呼び出すコード:

public DataTable <b>GetEmployeeName</b>(int _employeeID)
{
            ArrayList arrEmployeeName = new ArrayList();
            OracleParameter paramEmployeeId = new OracleParameter(":employeeid", _employeeID);
            arrEmployeeName.Add(paramEmployeeId);
            DataLayer obj = new DataLayer();
            DataTable tblEmployee = obj.<b>GetData</b>("macw_conv.worker_name", arrEmployeeName, "SP");

            if (tblEmployee.Rows.Count &gt; 0)
            {
                return tblEmployee;
            }
            return null;
        }

public DataTable <b>GetData</b>(string query, ArrayList parameters,string queryType)
{
            //DataTable dt = new DataTable();
            try
            {
                _con =
                    new OracleConnection(Oradb);
                _con.Open();
                _cmd = new OracleCommand(query, _con);
                if (_cmd.Connection.State == ConnectionState.Open)
                {
                    if (queryType == "SP" &amp;&amp; parameters != null)
                    {
                        _cmd.CommandType = CommandType.StoredProcedure;
                        if (parameters.Count &gt; 0)
                        {
                            foreach (OracleParameter param in parameters)
                            {
                                _cmd.Parameters.Add(param);
                            }
                        }
                    }
                }
                DataSet ds = new DataSet();
                OracleDataAdapter da = new OracleDataAdapter(_cmd);
                da.Fill(ds);
                if (ds.Tables.Count &gt; 0)
                {
                    return ds.Tables[0];
                }
                return null;
            }

私は明らかなエラーを見ることができないと思います。これは、ストアド プロシージャの out パラメーターとコードの output パラメーターの間のデータ型の不一致に関するものです。どんな種類の助けも大歓迎です。

ありがとう!

私は問題を理解しました: それは、out パラメータを保存している変数のデータ型が適切に処理されなかったためです。次のようにコードを変更しました。

try
{
            _con = new OracleConnection(Oradb);
            _cmd = _con.CreateCommand();
            _cmd.CommandType = CommandType.StoredProcedure;
            _cmd.CommandText = "macw_conv.worker_name";

            OracleParameter inobj1 = _cmd.Parameters.Add("w_id", OracleDbType.Int32,50);
            inobj1.Direction = ParameterDirection.Input;
            inobj1.Value = _employeeID;

            OracleParameter inobj2 = _cmd.Parameters.Add("w_last", OracleDbType.Int32, 50);
            inobj2.Direction = ParameterDirection.Input;
            inobj2.Value = String.IsNullOrEmpty(_lastName) ? null : _lastName;


            OracleParameter outobj = _cmd.Parameters.Add("w_first", OracleDbType.Varchar2, 50);
            outobj.Direction = ParameterDirection.Output;
            _con.Open();
            _cmd.ExecuteNonQuery();
            _employeeName = ((OracleString) _cmd.Parameters[1].Value).ToString();
            _cmd.Dispose();
            _con.Close();
}
catch (OracleException ex)
{
    Console.WriteLine(ex.Message);
}

return _employeeName;  
4

1 に答える 1

0

試す

public DataTable GetEmployeeName(int _employeeID)
        {
            ArrayList arrEmployeeName = new ArrayList();

            OracleParameter paramEmployeeId = new OracleParameter("employeeid", _employeeID);
            arrEmployeeName.Add(paramEmployeeId);

            OracleParameter paramEmployeeFirst = new OracleParameter("first", OracleDbType.Varchar2, ParameterDirection.Output);
            arrEmployeeName.Add(paramEmployeeFirst);

            DataLayer obj = new DataLayer();
            DataTable tblEmployee = obj.GetData("macw_conv.worker_name(:1,:2)", arrEmployeeName, "SP");
            if (tblEmployee.Rows.Count &gt; 0)
            {
                return tblEmployee;
            }
            return null;
        }
于 2012-12-05T08:25:41.990 に答える