System.Messaging.MessageQueueTransaction  objtran=new  MessageQueueTransaction();  
                                               System.Messaging.Message  objMsg=new  System.Messaging.Message();  
                                     
                                               objtran.Begin();  
                                               objMsg.Label="0200011111";  
                                               objMsg.Body=ds;  
 
                                               System.Messaging.MessageQueue  objque=new  System.Messaging.MessageQueue("FormatName:DIRECT=TCP:172..0.0.1\\private$\\222send");  
                                               objque.Send(objMsg,objtran);  
                                               objtran.Commit();  
 
这样虽然说是把数据集发出去了,但是怎么接收呢?是不是dataset要先经过序列化发送后才能接收?我曾经尝试过用二进制序列化但是在接收的反序列化(ds=(DataSet)binaryFormatter.Deserialize(mStm2))时提示版本不一致。

解决方案 »

  1.   

    格式化程序默认为 XmlMessageFormatter
    不是BinaryFormatter
      

  2.   

    http://weblogs.asp.net/aaguiar/articles/27459.aspxDataSets and Serialization
      

  3.   

    try:DataSet ds = objque.Receive().Body as DataSet;
      

  4.   

    呵呵,直接接收好了,DataSet本身会支持序列化的,不需要这样的动作。除非你用的是继承自DataSet的自定类
      

  5.   

    DataSet本身的序列化做得不好,建议使用DataSet.ReadXml和DataSet.WriteXml
      

  6.   

    To:  qimini(循序渐进) :直接接收好了,DataSet本身会支持序列化的,不需要这样的动作。除非你用的是继承自DataSet的自定类。
    直接接收objMsg.Body怎么能转换为dataset呢?(DataSet)objMsg.Body不行哦。
      

  7.   

    To:   volcano3035112(火山)    怎么使用固定的版本号编译服务端程序?Thks!
      

  8.   

    ~~~
    我试了一下,发送情况下可以,l以下语句调试通过DataSet ds = new DataSet();
    System.Messaging.MessageQueueTransaction  objtran=new  MessageQueueTransaction();  
                                                   System.Messaging.Message  objMsg=new  System.Messaging.Message();  
                                         
                                                   objtran.Begin();  
                                                   objMsg.Label="0200011111";  
                                                   objMsg.Body=ds;  
     
                                                   System.Messaging.MessageQueue  objque=new  System.Messaging.MessageQueue("FormatName:DIRECT=TCP:172..0.0.1\\private$\\222send");  
                                                   objque.Send(objMsg,objtran);  
                                                   objtran.Commit();  DataSet ds2 = (DataSet)objMsg.Body;
      

  9.   

    至于消息接受端,手上没有环境,无法调试
    但理论上应该可以,如果的确出错的话可以用DataSet.WriteXml和ReadXml方法来实现不过可以把你的代码片断给我传一份,明天到公司再帮你看看
      

  10.   

    To:qimini(循序渐进):DataSet ds2 = (DataSet)objMsg.Body;
    这句话调试不通过。错误提示:"System.InvalidCastException: 指定的转换无效。
      

  11.   

    接收片段:
    MSMQ.MSMQQueueInfo objInfo=new MSMQ.MSMQQueueInfoClass();
    MSMQ.MSMQQueue objQueue=new MSMQ.MSMQQueueClass();
    MSMQ.MSMQMessage objMsg;
    DataSet ds= new DataSet();
    string strMsg;
    bool blResult=true;
    object objType=Type.Missing;
    object objTimeOut=10000;
    object objTimeOut1=1000;
    objInfo.FormatName="DIRECT=TCP:127.0.0.1\\private$\\222Send";
    try
    {
    objQueue=objInfo.Open(1,0);
    objMsg=objQueue.PeekCurrent(ref objType,ref objType,ref objTimeOut,ref objType);
    ds =(DataSet)objMsg.Body;
    string sss="";
    sss=ds.Tables[0].Rows[0][1].ToString();

    }
      

  12.   

    序列化為xml後是可以的,發送
    objMsg.Body=cls.XmlLib.ObjectSerializeToXML(ds);  
    接收
    msgQ.Formatter = new XmlMessageFormatter(new Type[]{typeof(string)});
    inMsg = msgQ.Receive();
      

  13.   

    To: alien54155415() 
    inMsg是消息。我知道,接收是可以,但是接收后怎么把inMsg.Body转换为dataset?谢谢。
      

  14.   

    TO:qimini(循序渐进)
    有权限操作队列,也存在,能接收但是不能把消息的Body转成DataSet。我把片段传给你了,在不耽误你工作的情况下指导。谢谢!
      

  15.   

    接收的inMsg.Body=<?xml version=\"1.0\"?>\r\n<DataSet>\r\n...</DataSet>"
    然後反序列化成DataSet: ds =(DataSet)cls.XmlLib.XMLDeSerializeToObject(inMsg.Body.ToString(),ds);
      

  16.   

    to:alien54155415() 
    cls.XmlLib.XMLDeSerializeToObject 中的cls是什么东东?
      

  17.   

    你可以看下MSDN中XmlSerializer.Deserialize 方法的範例
      

  18.   

    我也遇到相同问题,发送DATASET对象时,消息队列服务器接受到的只是一个空的DataSet,里面什么也没有
      

  19.   

    附上代码片段
    private System.Messaging.MessageQueue mqAsy;
    //发送端
    mqAsy.Formatter=new XmlMessageFormatter(new Type[]{typeof(DataSet)});DataSet ds=new DataSet();
    ds.Tables.Add(dtlLog);System.Messaging.Message m=new System.Messaging.Message(ds);
    mqAsy.Send(m);//接收端
    mqAsy.Formatter=new XmlMessageFormatter(new Type[]{typeof(flMsg)});mqAsy.ReceiveCompleted+=new ReceiveCompletedEventHandler(mqAsy_ReceiveCompleted);mqAsy.BeginReceive();


    private DataTable dtlLog;
    private void mqAsy_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
    {DataSet ds=(DataSet)mqAsy.EndReceive(e.AsyncResult).Body;
    //上面一句确实返回了DataSet,但是在查看时里面什么也没有
    // this.dataGrid1.DataSource=ds.Tables[1]; DataSet newmsg=mqAsy.EndReceive(e.AsyncResult).Body as DataSet;
    // this.lstMsg.Items.Add(newmsg.Tables[0].TableName);
    // this.dataGrid1.DataSource=newmsg; mqAsy.BeginReceive();
    }
      

  20.   

    写错了
    //接收端
    mqAsy.Formatter=new XmlMessageFormatter(new Type[]{typeof(flMsg)}); 应为
    //接收端
    mqAsy.Formatter=new XmlMessageFormatter(new Type[]{typeof(DataSet)});
      

  21.   

    后来发现问题所在:
      异步接收消息时取不到DATASET的值,直接用mq.Receive()就可以了
      

  22.   

    fellowcheng(头都编大了)的方法最簡單.