日期:2014-05-17  浏览次数:20407 次

用Oledb方式同时连接MS-SQL和Sybase时分布式事务TransactionScope的相关问题
先说下小弟的问题:

最近的一个项目需要和第三方做一个接口,第三方的数据库是sybase,版本还比较老,11.9的,所以Ado.net的驱动没成功,后来用了Oledb的方式连接是没什么问题了,现在遇到的问题是想用分布式事务的方式来实现回滚操作,但是一直不成功;

我原本的想法是如下:
C# code

            using (TransactionScope scope = new TransactionScope())
            {
                bool aaa = InsertMySQLServer(); //插入我方的MS-SQL数据库
                bool bbb = InsertSybaseServer(); //插入对方的Sybase数据库
                if (aaa && bbb)
                {
                    scope.Complete();
                }
            }


想通过分布式事务的方式实现完善的回滚解决数据库操作出错时的各种问题,
但是在实际操作过程中程序执行到bool bbb = InsertSybaseServer(); 
时一直提示:对COM 组件的调用返回了错误 HRESULT E_FAIL
调试机器的Distributed Transaction Coordinator 服务是开启的
其中InsertSybaseServer(); //插入对方Sybase数据库是用Oledb的方式,具体代码如下:

这一段我单独执行时是没问题的,可以成功往对方数据库插入数据
C# code

            OleDbConnection Conn = new OleDbConnection("Provider=Sybase.ASEOLEDBProvider;Srvr=ip,5000;Catalog=databasename;User Id=username;Password=password");

            Conn.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = Conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "myProcedure";

            DataTable ds = new DataTable();


            OleDbParameter menu = new OleDbParameter("menu", OleDbType.Char);
            menu.Direction = ParameterDirection.Input;
            menu.Value = "yltest888";
            cmd.Parameters.Add(menu);


            //省略参数若干

            OleDbParameter ret = new OleDbParameter("ret", OleDbType.Integer, 4);
            ret.Direction = ParameterDirection.ReturnValue;
            ret.Value = 0;
            cmd.Parameters.Add(ret);

            OleDbParameter msg = new OleDbParameter("msg", OleDbType.Char, 50);
            msg.Direction = ParameterDirection.ReturnValue;
            msg.Value = "";

            cmd.Parameters.Add(msg);

            
            int result = cmd.ExecuteNonQuery();

            
            string aaa = msg.Value.ToString();
            string bbb = ret.Value.ToString();



是Oledb不支持分布式事务?还是这里是存储过程不支持?还是其他原因,忘指教

------解决方案--------------------
顶,顶,更健康呢