开发者

Transaction error with Microsoft Lightswitch using Oracle database

I am making a very simple Lightswitch project which will connect to a table I have in an Oracle 11g database. I add an editable grid to the project and build the project. When I try to add or edit data in the grid I get the following error:

An error occurred while starting a transaction on the provider connection. See the inner exception for details.

Inner exception message: Connection is already part of a local or a distributed transaction

There is no custom code in the project. My perception was that Lightsw开发者_Go百科itch was supposed to make forms over data very easy. I've looked around for help but nothing so far.


//You need to clean up or the txn will fail..

 partial void SaveChanges_Executed()
{
    tx.Complete();
    tx.Dispose();
}


If you get this error, "Inner exception message: Connection is already part of a local or a distributed transaction"

you can resolve the issue by following the second post by BScholz, https://forums.oracle.com/forums/thread.jspa?threadID=2263095

Basically, you need to implement SaveChanges_Excuting and SaveChanges_Excuted for the Oracle Data Source.

  1. Switch to "File View" (LightSwitch will display "Logical View" by default).
  2. Add a reference to "System.Transactions" in Server project.
  3. Switch back to "Logical View"
  4. Right Click the Data Source Name and click "View Code" to edit partial class.
  5. Copy-and-paste the code below:

    private TransactionScope _tscope;
    
    partial void SaveChanges_Executing()
    {
        _tscope = new TransactionScope(TransactionScopeOption.Required,
        new TransactionOptions
        {
            IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted
        });
    }
    
    partial void SaveChanges_Executed()
    {
        _tscope.Complete();
        _tscope.Dispose();
    }
    


Try adding this code to your datasource code. (right click on the Oracle datasource and choose "View Code")

Make sure you remember to change the class name to match your datasource.

using System.Transactions;

namespace LightSwitchApplication
{
    public partial class <ChangeThisToYourClassName>
    {
        private TransactionScope tx;

        partial void SaveChanges_Executed()
        {
            tx.Complete();
        }

        partial void SaveChanges_Executing()
        {
            tx = new TransactionScope(TransactionScopeOption.Required, 
                  new TransactionOptions { 
                      IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted
                  });
        } 
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜