ОК, этот ответ не по теме, но я должен: пожалуйста, не делайте запускайте и забудьте с сервисным брокером. Шаблон сообщения begin-send-end имеет много проблем, начиная от невозможности устранения неполадок, связанных с ошибками, когда ваша база данных переводится в автономный режим. Последнее связано с ошибкой в SSB (SQL Service Broker), но я видел, что это происходит, и это вызвано шаблоном сообщения «забыл и забыл».
Да, и еще одна вещь: я не знаю, что такое DBArtisan, но он видит ваше ASCII-сообщение действительным, то есть он переводит столбец message_body в varchar (max), вот и все.
И поскольку мой пост уже большой, позвольте мне немного углубиться в кодировку XML и SSB. Как вы, вероятно, знаете, SSB предлагает проверку сообщений XML, если вы объявляете тип сообщения [SAPP_MSG_MessageType]
как VALIDATION = WELL_FORMED_XML
. Но ASCII и UNICODE являются допустимыми кодировками XML и оба поддерживаются SSB. Вы можете отправить сообщение N '<someTag>somecontent</someTag>'
, а также '<someTag>somecontent</someTag>'
, оба являются допустимыми фрагментами XML. Вы также можете добавить явные инструкции по обработке XML, объявляющие кодировку, например <?xml version="1.0" encoding="utf-8"?>
или N <?xml version="1.0" encoding="utf-16"?>
. Однако вы рискуете не соответствовать им, например, объявив N <?xml version="1.0" encoding="utf-8"?>
, что на самом деле является недопустимым XML (поскольку объявленная кодировка не соответствует кодировке документа). Вы можете столкнуться с очень тонкими и сложными проблемами, как эта. Это прекрасный пример проблемы, которая может привести к тому, что целевая служба отклонит сообщение и завершит работу с диалоговым окном с ответом проверки XML, который вы пропустите, потому что ... вы выполняете запрос на запуск:)
В своей практике (я был одним из членов команды SQL Service Broekr в MS) я обнаружил, что лучший способ избежать каких-либо проблем - объявить переменные, содержащие отправленный (@msg), тип xml , не varchar, ни nvarchar . Это решает все проблемы, а также правильно учитывает необходимость и наличие спецификации в вашем XML . Это также относится и к передаваемым параметрам C #, лучше всего использовать тип SqlXml и / или значение System.Data.SqlDbType.Xml .
Также на принимающей стороне очереди (ваша активированная процедура или процесс, который читает целевую очередь), вы должны преобразовать тело сообщения в тип XML, а не в varchar / nvarchar. И пока мы обсуждаем эту тему, убедитесь, что вы не разыграли во время получения, а только после получения, потому что обработка ошибок XML взаимодействует с активацией . * 1036. *