воскресенье, 16 мая 2010 г.

Прикольный workaround для деплоя репортов в Reporting Services

Reporting Services штука полузная. Сделаные в VS репорты для него можно деплоить по разному. Через web интерфейс, с помощью SQL Server Management Studio. Но иногда нужны автоматические скрипты. Для этого есть утилитка rs.exe.
rs.exe -i MyReportScript.rss -s http://localhost/reportserver
MyReportScript.rss - это скрипт на VB, который и загружает репорт или репорты.
Вот так примерно выглядит код загрузки:

  1. Try
  2.   Dim stream As FileStream = File.OpenRead(reportName + ".rdl")
  3.   definition = New [Byte](stream.Length) {}
  4.   stream.Read(definition, 0, CInt(stream.Length))
  5.   stream.Close()
  6.   Catch e As IOException
  7.   Console.WriteLine (e.Message)
  8. End Try
  9.  
  10. Try
  11.   warnings = rs.CreateReport(reportName, reportsPath, True, definition, props)
  12.   Console.WriteLine("Upload Report: {0}.", reportName)
  13.   Catch e As Exception
  14.   Console.WriteLine (e.Message)
  15. End Try

Репорты делал не я и делались они 2005 студии. У меня стоит 2008, после пары изменений, я получаю вот такое сообщение:
System.Web.Services.Protocols.SoapException: The report definition is not valid.  Details: '.', hexadecimal value 0x00, is an invalid character. Line 4334, position 10.
Через Management Studio загружается нормально.
Конечно же файл репорта представляет из себя просто ужасный xml. И что мы видем в строчке 4334? Заключительный закрывающийся тэг:
Становится совсем не понятно, но всемогущий гугль легко находит линку:
RS.EXE fails to deploy a report upgraded from SQL Server 2005 Reporting Services - "report definition is not valid"
Предложенное решение проблемы меня просто поставило в тупик

  1. Replacing
  2.      My_Byte_Array = New [Byte](stream.Length) {}
  3. With
  4.      My_Byte_Array = New [Byte](stream.Length - 1) {}

Вообщем даже не представляю как это у них получилось cгенерировать такую проблему в новой студии, вообщем просто в шоке =D
Хотя я иногда и по круче отжиги делаю :)

З.Ы.: Сорри за не самую красивую подсветку, просто мой любимый Online syntax highlighter что-то с VB на отрез отказался работать, а HTML Source Code Syntax Highlighter хоть и подсвечивает код, но не очень красиво.

З.Ы.Ы.: Катя подсказала более крутой сервис для подсветки кода, так как ей нужен был Object C, то она нашла вот этот, количество языков поражает. Только надо выбрать опцию Combine Style and HTML, чтобы он не генерировал отдельно css стиль, а всё выдавал html кодом. Качество подсветки хорошее.