【问题标题】:WCF, MySQL and TransactionWCF、MySQL 和事务
【发布时间】:2012-01-24 04:24:12
【问题描述】:

我在 Windows Communication Foundation Server 应用程序中的 MySql.Data.MySqlClient.MySqlTransaction 中遇到问题。

我在实现 ServiceContract 接口的类的方法中使用 MySqlTransaction,当我尝试运行服务时它会抛出此错误:

System.Runtime.Serialization.InvalidDataContractException:无法序列化类型“MySql.Data.MySqlClient.MySqlTransaction”。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果类型是集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。

我在 WCF 服务中的代码与此类似:

[ServiceContract]
public interface IDALService
{
    MySqlCommand Command { [OperationContract] get; [OperationContract] set; }

    [OperationContract]
    void Execute(string cmdText);
}

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class DALService : IDALService
{
    public MySqlCommand Command { get; set; }

    public DALService()
    {
        Command = null;
    }

    public void Execute(string cmdText)
    {
        MySqlCommand SQLCom = this.Command??new MySqlCommand();
        SQLCom.CommandText = cmdText;

        if (this.Command == null)
        {
            SQLCom.CommandType = CommandType.Text;
            SQLCom.Connection = new MySqlConnection(/* ... */);
            SQLCom.Connection.Open();
            SQLCom.Transaction = SQLCom.Connection.BeginTransaction();
        }

        if (this.Command == null)
        {
            try
            {
                SQLCom.ExecuteScalar();
                SQLCom.Transaction.Commit();
            }
            catch { SQLCom.Transaction.Rollback(); throw; }
            finally { SQLCom.Connection.Close(); }
        }
        else SQLCom.ExecuteScalar();
    }
}

在我的网络浏览器中输入http://localhost:1257/DALService.svc 就会发生错误。

我在 Microsoft Visual Studio 2010 Pro 中使用 Framework 4,C# 代码。

请帮忙。 提前致谢。

【问题讨论】:

  • 这不是您的完整 Execute 方法,或者无法编译。我没有看到退货声明。我们应该从可以编译的东西开始。
  • 我更新了我的问题(将返回类型更改为 void,并删除 try 语句中的 'Result' 变量)
  • 这是DALService中唯一的方法吗?
  • Visual Studio 2010(以及所有以前的版本我已经工作过)包含一个调试器...请在询问 SO 问题之前使用它,因为这里没有人除非您付出一些努力,否则将尝试为您运行您的代码。您能至少告诉我们异常发生在哪一行 line 上吗?
  • 我再次更新了我的问题(添加了我的所有代码)。抱歉,我正在开发该服务,我还不能运行它,因为我没有代码来实现该服务。但是你知道为什么在我创建的服务上运行任何方法之前就会发生错误吗?

标签: c# mysql wcf .net-4.0


【解决方案1】:

这不可能是导致问题的代码。您收到的错误来自尝试向/从服务返回或传递 MySqlTransaction 。这根本行不通。

另外,你到底为什么要通过公共属性将 Command 对象暴露给外界?此外,您甚至没有使用它...删除该属性并将您的命令范围限定为使用它的方法。如果你不这样做并且你将这个服务作为一个单例运行,你会得到很多疯狂的错误。

更何况……这是一个极其危险的暴露服务。如果您要让别人使用它而不是您自己,它提供零封装。哎呀,你还不如直接打开一个到 SQL Server 的端口,听起来很愚蠢。

【讨论】:

  • 当我想通过一个连接多次调用 Execute 方法时使用它,我将它回滚或在服务之外提交。所以你是说我不能在 WCF 中传递 MySQLCommand?
  • 不,你不能。它不会是可序列化的。传递给 WCF 服务的任何内容都必须是可序列化的。想一想,如何将命令对象表示为 XML 字符串(我知道还有其他方法可以序列化)?答案是,你不能。
  • 我认为你最好的选择是使用命令模式,并将它们传递给 WCF 服务,然后将命令转换为服务器端的 MySQLCommands。
  • 你可以,但绝对不应该。这是您正在编写的一项极其危险的服务。
  • 好的,我会尝试创建一个命令模式。此服务仅限本地网络,仅供公司员工使用。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2014-06-18
相关资源
最近更新 更多