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))时提示版本不一致。
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))时提示版本不一致。
不是BinaryFormatter
直接接收objMsg.Body怎么能转换为dataset呢?(DataSet)objMsg.Body不行哦。
我试了一下,发送情况下可以,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;
但理论上应该可以,如果的确出错的话可以用DataSet.WriteXml和ReadXml方法来实现不过可以把你的代码片断给我传一份,明天到公司再帮你看看
这句话调试不通过。错误提示:"System.InvalidCastException: 指定的转换无效。
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();
}
objMsg.Body=cls.XmlLib.ObjectSerializeToXML(ds);
接收
msgQ.Formatter = new XmlMessageFormatter(new Type[]{typeof(string)});
inMsg = msgQ.Receive();
inMsg是消息。我知道,接收是可以,但是接收后怎么把inMsg.Body转换为dataset?谢谢。
有权限操作队列,也存在,能接收但是不能把消息的Body转成DataSet。我把片段传给你了,在不耽误你工作的情况下指导。谢谢!
然後反序列化成DataSet: ds =(DataSet)cls.XmlLib.XMLDeSerializeToObject(inMsg.Body.ToString(),ds);
cls.XmlLib.XMLDeSerializeToObject 中的cls是什么东东?
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();
}
//接收端
mqAsy.Formatter=new XmlMessageFormatter(new Type[]{typeof(flMsg)}); 应为
//接收端
mqAsy.Formatter=new XmlMessageFormatter(new Type[]{typeof(DataSet)});
异步接收消息时取不到DATASET的值,直接用mq.Receive()就可以了