遇到一个问题,实在解决不了,所以贴到论坛上,请教 ~~ 在c# 程序中调用oracle的存储过程,并且调用的存储过程中 有事务处理的代码 (关键是 savepoint X ,roll back )
 如果注释掉 savepoint X 这句话,就不会出现异常 ~~ 如下为异常的详细信息 :栈跟踪: 
[Exception: ORA-02074: 无法在分布式事务处理中ROLLBACK
ORA-06512: 在"MB_MMS_SCHOOL_777.PK_IMPORT", line 407
ORA-02074: 无法在分布式事务处理中SET SAVEPOINT
ORA-06512: 在line 1
]
   SendSms.btnSubmitSMS_Click(Object sender, EventArgs e) in e:\source\GaoXiaoTongMIS\SendSms.aspx.cs:127
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +96
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +116
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +31
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +32
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +72
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3838 

解决方案 »

  1.   

    try
            {
                con = sh.CreateConn();
                command.Connection = con;                       command.CommandText = "pk_import.pr_mobile_sendsms";
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.Add("iId", OracleType.VarChar,100).Value = id;
                command.Parameters.Add("iPhone", OracleType.VarChar,100).Value = phones;
                command.Parameters.Add("iSms", OracleType.VarChar,100).Value = str_content;           
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
      

  2.   

    调用如下的存储过程 。。BEGIN
        ORESULT := DEF_FAIL;
        SAVEPOINT WSSMSSUBMIT1;
        BEGIN
    vSubSYSID := ISUBSYSID;
    if (vSubSYSID is null) then
    vSubSYSID := DEF_SUB_SYS_ID;
    end if;……
    …… EXCEPTION
            WHEN OTHERS THEN
                ROLLBACK TO WSSMSSUBMIT1;
      

  3.   

    我的oracle 数据库 是放到服务器上的。。
      

  4.   

    你的回滚点没设置好create table a(b varchar2(100),c varchar2(100))begin   
      insert into a(b) values('132'); 
      SAVEPOINT WSSMSSUBMIT1; 
      commit;   
      exception   when   others   then   
     ROLLBACK TO WSSMSSUBMIT1;
      end; 
    可以自行的
      

  5.   

    想请教 :那为啥用java 写的程序就可以呢
             .net 和java 的处理机制 有啥不同? ~~~        tks!~ 
      

  6.   

    BEGIN 
        ORESULT := DEF_FAIL; 
        BEGIN
       SAVEPOINT WSSMSSUBMIT1;  

    vSubSYSID := ISUBSYSID; 这个换个位置看看,不行就再换了看看
      

  7.   

    这个我也不知道,最近也在弄orcale,不过跟你不同的是,我的事务都是在程序里面写的
      

  8.   

    哎,关键问题 是 所有这些oracle 的储存过程所涉及的业务逻辑 ,是公司内容所有都在用的,
    是不能修改的。只能考虑在程序里来处理 。 
      

  9.   

    ---create table a(b varchar2(100),c varchar2(100))表名create or replace procedure inserta is
    begin
       SAVEPOINT WSSMSSUBMIT1; 
      insert into a(b) values('132'); 
      
      commit;   
      exception   when   others   then   
     ROLLBACK TO WSSMSSUBMIT1;
    end inserta;
                OracleConnection con = new OracleConnection("....");
                OracleCommand command = new OracleCommand();
                command.Connection = con;
                try
                {
                    con.Open();
                    command.CommandText = "inserta";
                    command.CommandType = CommandType.StoredProcedure; 
                    command.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    con.Close();
                    throw new Exception(ex.Message);
                }
    我调用了一下,没有问题,你先简化一下存储过程,然后一点点调试,看看究竟哪一步错了
      

  10.   

    是不是你的服务器数据库有问题,我刚才也连了下服务器,没有问题            OracleConnection con = new OracleConnection("Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.2.11)(PORT =1521)))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME =...))); User Id = ...; Password = ...");
      

  11.   

    OracleConnection con = new OracleConnection("Data Source=DB234;User Id=username;Password=pwd");其中DB234 为在我本机上配置的跟服务器数据库建立连接的名字(配置绝对没有问题 ,因为其他的查询啥的操作都没有问题啊 )  。这样有问题吗 ?
      

  12.   

    将以下属性添加到连接字符串为 Oracle 数据库
    Workaround Oracle Bug 914652=true
      

  13.   

    Ole DB: set distribtx=0 in the connection string 
    ODBC: check the option in the DSN configuration entitled "disable MTS 
    support" 
      

  14.   


    OracleConnection con = new OracleConnection("Data Source=mydatasource;User Id=username;Password=pwd;Workaround Oracle Bug 914652=true
    "); 这样写连接字符串,就不会出现异常了。;>  o~~这是Oracle的一个Bug 914652 在目前的开发环境中无法解决。