我有一些奇怪的问题。我认为我正确地遵循了文档,但我的代码不起作用。我有这个非常简单的硬编码测试(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
我的测试应用程序有效。如何从代码配置代码页?
答案 0 :(得分:1)
我发现了一个解决方法 - 它可能解决了我的问题,但我对此并不十分满意。我可以全局设置MQCCSID
环境变量,也可以调用:
Environment.SetEnvironmentVariable("MQCCSID", "437");
这将配置代码页。我仍然想使用新MQQueueManager
实例的属性来设置代码页。
答案 1 :(得分:0)
在Windows 7区域设置 - &gt;上将您的系统区域设置更改为英语(美国)管理 - &gt;更改系统区域设置。也可以在执行此操作后以regedit值检查它。 regedit-&gt; HKEY_LOCAL_MACHINE-&gt; SYSTEM-&gt; CurrentControlSet-&gt; Control-&gt; Nls-&gt; CodePage检查OEMCP值。
答案 2 :(得分:0)
这两个答案都是正确的。对于Windows Forms Project,设置环境变量MQCCSID与您尝试连接的队列管理器的ccsid相同就足够了。 - 第二个解决方案
HKEY_LOCAL_MACHINE-&gt; SYSTEM-&gt; CurrentControlSet-&gt; Control-&gt; Nls-&gt; CodePage&gt; OEMCP值。
我有一个仅适用于第二个解决方案的Web应用程序(Web表单)