为什么在C#里调用ORACLE的存储过程那么麻烦?不明白为什么要写包头及包体和游标。为何不像SQL SERVER一样???感觉到ORACLE里写存储过程没有在SERVER里写的爽。有没有人举个简单的C#调用ORACLE存储过程的例子?

解决方案 »

  1.   

    OracleConnection conn = new OracleConnection(Connstr);
    conn.Open();
    OracleTransaction tx = conn.BeginTransaction();
    OracleCommand cmd = conn.CreateCommand();
    cmd.Transaction = tx;
    cmd.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end;";
    cmd.Parameters.Add(new OracleParameter("tempblob", OracleType.Blob)).Direction = ParameterDirection.Output;
    cmd.ExecuteNonQuery();
    OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
    tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
    tempLob.Write(picValue,0,picValue.Length);
    tempLob.EndBatch();
    cmd.Parameters.Clear();
    cmd.CommandText = "PKG_PEPWEB_TransgressMGR.AddTransgressInfo";
    cmd.CommandType = CommandType.StoredProcedure;  
    cmd.Parameters.Add( new OracleParameter( "AHPZL",OracleType.VarChar,2 ) ).Value = m_HPZL;
    cmd.Parameters.Add( new OracleParameter( "AHPHM",OracleType.VarChar,15 ) ).Value = m_HPHM;
    cmd.Parameters.Add( new OracleParameter( "AWFSJ",OracleType.DateTime ) ).Value = DateTime.Parse(m_WFSJ);
    cmd.Parameters.Add( new OracleParameter( "ARoadID",OracleType.VarChar,10 ) ).Value = m_RoadID;
    cmd.Parameters.Add( new OracleParameter( "Awzxwno",OracleType.VarChar,200 ) ).Value = m_WFXW;
    cmd.Parameters.Add( new OracleParameter( "AJCSD",OracleType.Number,4 ) ).Value = Decimal.Parse(m_JCSD);
    cmd.Parameters.Add( new OracleParameter( "APICNAME",OracleType.VarChar,200 ) ).Value= m_PICNAME;
    cmd.Parameters.Add( new OracleParameter( "ACARSTATE",OracleType.VarChar,1 ) ).Value = m_CARSTATE;
    cmd.Parameters.Add( new OracleParameter(  "AJBR",OracleType.VarChar,30 ) ).Value = m_JBR;
    cmd.Parameters.Add( new OracleParameter( "APHOTO", OracleType.Blob ) ).Value = tempLob;
    OracleParameter or=new OracleParameter("FLAG", OracleType.Int32);
    or.Direction = ParameterDirection.Output;
    cmd.Parameters.Add( or );
    try
    {
    cmd.ExecuteNonQuery();
    tx.Commit();
    }
    catch (OracleException ex)
    {
    s=ex.Message;

    throw ex;
    }
    if ( s!=null)
    {

    }
    return (int)or.Value;
      

  2.   

    //这个是使用GotDotNet.ApplicationBlocks.Data.Oracle调用oracle存储过程的
    public DataSet GetRoadALL()
    {
    DataSet ds=new DataSet();
    adoHelper.GetSpParameterSet(Connstr,"PKG_PEPWEB_Road.GetRoadALL");
    OracleParameter[] oraParameter=new OracleParameter[1];
    oraParameter[0]=new OracleParameter("Rst",OracleType.Cursor);
    oraParameter[0].Direction=ParameterDirection.Output;
    ds=adoHelper.ExecuteDataset(Connstr,"PKG_PEPWEB_Road.GetRoadALL",oraParameter);
    return ds;
    }
      

  3.   

    请问GotDotNet.ApplicationBlocks.Data.Oracle组件在哪里下载和怎么用?存储过程返回数据集是不是一定写在包体里才能实现?