please give us more detailswhat database(s)? how many databases are involved? what are you doing in your stored procedure, how does your server code look like?

解决方案 »

  1.   

    你可能要用BEGIN DISTRIBUTED TRANSACTION。
    这个错误的意思是,ROLLBACK只能回滚本地事务,如果你执行事务在分布式服务器上,请用上面这个语句显式地启用分布式事务。
      

  2.   

    我用的是Oracle数据库,存储过程有判断操作表出错时回滚,正确则提交。
    Web服务器上装Oracle与分两台机装的效果是一样的,存储过程在sqlplus下单独运行可以Rollback。
     BEGIN DISTRIBUTED TRANSCATION 语句若何写?事物如何提交?如何回滚?我是在ASP.net中调用存储过程。谢谢!
      

  3.   

    what version of Oracle? What data provider are you using?when you got errors, is Oracle on the same machine as the web server or on another machine?
      

  4.   

    Oralce8.16,与Web服务同机或分开均一样,谢谢思归兄了。我在线等。
      

  5.   

    actually, I have no clue, :-)show your stored procedure and relevant C#/VB.NET code
      

  6.   

    举个简单的例子:
    一:ASP.net代码:
     public void brno_collect()
    {
    decimal Imsg; OleDbConnection myDbConn = new OleDbConnection(Session["DbConnstr"].ToString()); string Szoneno=Session["Szoneno"].ToString();

    OleDbCommand brnocm = new OleDbCommand ("brno_procedure",myDbConn);
    brnocm.CommandType = CommandType.StoredProcedure; brnocm.Parameters.Add("@v_zoneno",OleDbType.VarChar ,4);
    brnocm.Parameters ["@v_zoneno"].Value =Szoneno;

    brnocm.Parameters.Add("@IYDays",OleDbType.VarChar,3);
    brnocm.Parameters["@IYDays"].Value=int.Parse(Session["SYDays"].ToString()); brnocm.Parameters.Add("@v_us",OleDbType.VarChar ,3);
    brnocm.Parameters ["@v_us"].Value =CurrValue1.US; brnocm.Parameters.Add("@v_rmb",OleDbType.VarChar ,3);
    brnocm.Parameters["@v_rmb"].Value=CurrValue1.RMB ; brnocm.Parameters.Add("@Sworkdate",OleDbType.VarChar ,10);
    brnocm.Parameters ["@Sworkdate"].Value =Session["workdate"].ToString(); brnocm.Parameters .Add ("@v_msg",OleDbType.Numeric  ,40 );
    brnocm.Parameters ["@v_msg"].Direction =ParameterDirection.Output ;
    myDbConn.Open (); try
    {
    brnocm.ExecuteNonQuery ();
    Thread.Sleep(10000);
    }
    catch(Exception err)
    {
    Session["ResultText"]="错误提示:"+err.Message ;
    return;
    }
    finally
    {
    myDbConn.Close ();
    }
    Imsg = (decimal)(brnocm.Parameters ["@v_msg"].Value);
    if(Imsg == 0)
    {
    Session["ResultText"] = "成功处理数据";
    return;
    }
    else
    {
    Session["ResultText"] = "处理数据失败";
    return;
    }
    }二:存储过程代码(有截取)
    create or replace PROCEDURE brno_procedure
        (v_zoneno  in    varchar2,
         IYDays  in  number,     --当年的实际天数
         v_us  in    varchar2,  --外部宏定义的美元币种值,一般情况下为014
         v_rmb  in  varchar2,  --外部宏定义的人民币币种值,一般情况下为001
         Sworkdate  in varchar2,
         v_msg       out   number)
    IS
        v_out_zoneno pfdpsum.zoneno%type;
        v_branch pfdpsum.branch%type;
        v_currtype pfdpsum.currtype%type;
        v_subcode pfdpsum.subcode%type;
        v_subnature  pfdpsum.subnature%type;
        v_tddrbal pfdpsum.tddrbal%type;
        v_tdcrbal pfdpsum.tdcrbal%type;
        v_mbranch branch.mbranch%type;
        v_tjdm kmgl.tjdm%type;
        v_wbzsl number;
        v_rmbzsl number;
        v_error_code       NUMBER;
        v_error_message    VARCHAR2(255);
    BEGIN
    update brnobase set SDBAL=0,SFEEBAL=0;
    COMMIT;
    EXCEPTION
        WHEN  OTHERS  THEN
        --DBMS_OUTPUT.PUT_LINE ('Se2'||':'||v_subcode);
            ROLLBACK;
         v_error_code  :=  SQLCODE;
         v_error_message := SQLERRM;
         --DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_error_code)||': '|| v_error_message);
         v_msg := SQLCODE;
    end brno_procedure;
    说明:
      在存储过程出错时,可以提示"处理数据失败",但在存储过程中的Rollback执行不了,我在sqlplus下单独运行存储过程出错可以Rollback。所以应该是ASP.net中需要进行控制。请帮忙解答。
      

  7.   

    Public Function RunStoreProc(ByVal sStoreProduceName As String, Optional ByRef colParms As Collection = Nothing) 'As Integer
            strsqlconn = New SqlConnection(STRCONN)
            Dim sqlCMD As New SqlCommand(sStoreProduceName, strsqlconn)
            sqlCMD.CommandType = CommandType.StoredProcedure
            If Not IsNothing(colParms) Then
                Dim oParm As SqlClient.SqlParameter
                For Each oParm In colParms
                    sqlCMD.Parameters.Add(oParm)
                Next
            End If
            'Dim myParm As SqlClient.SqlParameter = sqlCMD.Parameters.Add("ReturnValues", SqlDbType.Int)  'modify by zhoumin
            'myParm.Direction = ParameterDirection.Output                                                   '2002-12-14
            strsqlconn.Open()
            sqlCMD.Transaction = strsqlconn.BeginTransaction()
            Try
                sqlCMD.ExecuteNonQuery()
                sqlCMD.Transaction.Commit()
                'Return myParm.Value '  sqlCMD.Parameters("@Balance").Value
            Catch e As Exception
                sqlCMD.Transaction.Rollback()
                Err.Raise(ErrNums.DBGetNextIDError, "CDatabase.RunStoreProc", "Error in running storeprocedure.")
            Finally
                strsqlconn.Close()
            End Try
        End Function
      

  8.   

    you can see this exemplum.
      

  9.   

    sorry, I do not have Oracle, I will suggest you to try outOracle Data Provider for .NET 
    http://otn.oracle.com/tech/windows/odpnet/content.htmlMicrosoft .NET Data Provider for Oracle 
    http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/001/940/msdncompositedoc.xml 
      

  10.   

    OleDbConnection 的连接不支持对Oracle的回滚吧?使用专用驱动