如何从代码中为MQQueueManager设置CCSID
本文关键字:MQQueueManager 设置 CCSID 代码 | 更新日期: 2023-09-27 18:10:33
我有一些奇怪的问题。我认为我遵循文档正确,但我的代码不工作。我有这个非常简单的硬编码测试(NUnit):
[TestFixture]
public class MQQueueTests {
public const string MessageContent = "<test>This is test message</test>";
public static void Main(string[] args) {
var tests = new MQQueueTests();
tests.PutAndGetMessage();
}
[Test]
public void PutAndGetMessage() {
var properties = new Hashtable
{
{MQC.HOST_NAME_PROPERTY, "TestServer"},
{MQC.CHANNEL_PROPERTY, "Test.Channel"},
{MQC.PORT_PROPERTY, 1415},
// Is this correct? It looks like it is not
// enough because adding this line didn't solve
// the problem.
{MQC.CCSID_PROPERTY, 437}
};
using (var manager = new MQQueueManager("Test.Queue.Manager", properties)) {
using (MQQueue queue = manager.AccessQueue("Test.Queue",
MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF)) {
MQMessage message = new MQMessage();
message.WriteUTF(MessageContent);
queue.Put(message);
MQMessage readMessage = new MQMessage();
queue.Get(readMessage);
Assert.AreEqual(MessageContent, readMessage.ReadUTF());
queue.Close();
}
manager.Disconnect();
}
}
}
我从控制台或通过Resharper 6测试运行器运行测试应用程序。如果我在测试运行器中运行应用程序,我总是得到以下异常:
IBM.WMQ。MQException: MQRC_CHANNEL_CONFIG_ERROR(原因码为2539)
异常由MQQueueManager.Connect
抛出(由其构造函数调用)。
如果我检查MQ日志,我看到:
AMQ9541: CCSID提供的数据转换不支持。
解释:程序结束是因为,源CCSID '437'或者目标CCSID '852'无效,或者当前不支持。
措施:纠正无效的CCSID,或确保可以支持请求的CCSID。
如果我从控制台运行应用程序,我得到了相同的错误,但如果我通过调用
来更改控制台的代码页chcp 437
我的测试应用程序工作。如何从代码配置代码页?
嗯,我找到了一个解决方法-它可能可以解决我的问题,但我不是很满意。我可以全局设置MQCCSID
环境变量或通过调用:
Environment.SetEnvironmentVariable("MQCCSID", "437");
这将配置代码页。我仍然想使用新的MQQueueManager
实例的属性来设置代码页。
这两个答案都是正确的。对于Windows Forms Project,将环境变量MQCCSID设置为与您尝试连接的队列管理器的ccsid相同就足够了。-第二个解决方案
HKEY_LOCAL_MACHINE ->系统-> CurrentControlSet ->控制-> Nls ->代码页> OEMCP价值。
我有一个web应用程序(web表单),只与第二个解决方案
将您的系统区域设置更改为英语(美国),在windows 7区域设置->管理->更改系统区域设置。这样做之后,你可以在regedit value中检查它。regedit->HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Control->Nls->CodePage检查OEMCP值。