这个句子:create or replace package body test
as
  /* copy from Join's note */
  procedure t1 is
  begin
   insert into t values(1);
  end t1;
end test;本来是一个非常简单的句子,在ps/sql里执行也是没问题的,但通过c#执行就有问题了,请高手帮忙解决一下...
我在c#里执行的:
cmd.CommandText="...";  //就是上面的那个句子
cmd.ExecuteNonQuery();出错现象:cmd.ExecuteNonQuery()执行成功不报错;但去数据库里看这个包是无效对象、并且编译无效对象不通过;右键选Edit Spec & Body直接编译则编译通过。如果把注释中的单引号去掉或配成对则没有问题,但不符合本意(是要从数据库读出包后由程序写入数据库,应该不做改动地照“原样”写)

解决方案 »

  1.   

    你在C#中调用包,应该不用那样子操作!
    给你一段VB调用的例子
    使用VB调用OW_SMP_Package.GetSendSM存储过程:Sub GetSendSM()
      Dim  cmd as New ADODB.Command
      Dim rs as New ADODB.RecordSet
      cmd.ActiveConnection = GetConnection'获得数据库连接
      cmd.CommandText = "{call ow_smp_package.GetSendSM(?,{resultset 1000,v_SerialNo,v_ServiceID,v_SMContent,v_SendTarget,v_Priority,v_RCompleteTimeBegin,v_RCompleteTimeEnd,v_RCompleteHourBegin,v_RCompleteHourEnd,v_RequestTime,v_RoadBy,v_SendTargetDesc,v_FeeValue,v_Pad1,v_Pad2,v_Pad3,v_Pad4,v_Pad5,v_Count})}"
      cmd.CommandType = adCmdText
      cmd.Parameters.Append .CreateParameter("v_NowByMinute", adInteger, adParamInput, , 900)
          
      Rs.CursorType = adOpenStatic
      Rs.LockType = adLockReadOnly
      Set Rs.Source = cmd
      Rs.Open   
      While Not Rs.EOF
          MsgBox "SendSM data:SerialNo: " & Rs("v_SerialNo") & ",SMContent: " & Rs("v_SMContent") & ",Count: " & Rs("v_Count")
          '对结果集的处理在这里增加代码
          Rs.MoveNext
       Wend
       Rs.Close   
       set Rs=nothing
       set cmd=nothing
    End Sub
      

  2.   

    请问楼主仔细检查一下C#中代码,是否执行 ExecuteNonQuery();
    我的程序中:
         cmd.CommandText = "InsrtTest";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.ExecuteNonQuery();
      

  3.   

    如果C#中没有问题,也许问题出现在PL-SQL中:
    有可能是因为你在编辑时没有将当前的package中没有声明t1.
      

  4.   

    改成下面的试试:create or replace package body test 
    as 
      /* --// copy from Join's note */ 
      procedure t1 is 
      begin 
      insert into t values(1); 
      end t1; 
    end test;