سؤال

أنا بحاجة إلى إنشاء عملية تكرار نشر خدمات تقارير SQL Server التقارير.أنا ليس في صالح باستخدام Visual Studio أو الأعمال التجارية استوديو تطوير للقيام بذلك.على rs.exe طريقة البرمجة نشر أيضا يبدو بدلا عالي الكعب.هل من أحد لديه وسيلة أنيقة جدا أنها كانت قادرة على نشر التقارير.المفتاح هنا هو أنني أريد أن تكون العملية مؤتمتة بالكامل.

هل كانت مفيدة؟

المحلول

نستخدم rs.exe بمجرد ان وضعت البرنامج النصي لدينا لا يحتاج إلى مسها بعد ذلك يعمل فقط.

هنا المصدر (أنا معدلة قليلا باليد لإزالة البيانات الحساسة من دون فرصة لاختبار ذلك ، آمل أن لا فرامل أي شيء) ، تنشر التقارير والصور المرتبطة بها من الدلائل لغات مختلفة.أيضا مصدر البيانات التي تم إنشاؤها.

'=====================================================================
'  File:      PublishReports.rss
'
'  Summary: Script that can be used with RS.exe to 
'           publish the reports.
'
'  Rss file spans from beginnig of this comment to end of module
' (except of "End Module").
'=====================================================================

Dim langPaths As String() = {"en", "cs", "pl", "de"}
Dim filePath As String = Environment.CurrentDirectory

Public Sub Main()

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    'Create parent folder
    Try
        rs.CreateFolder(parentFolder, "/", Nothing)
        Console.WriteLine("Parent folder created: {0}", parentFolder)
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try

    PublishLanguagesFromFolder(filePath)

End Sub

Public Sub PublishLanguagesFromFolder(ByVal folder As String)
    Dim Lang As Integer
    Dim langPath As String

    For Lang = langPaths.GetLowerBound(0) To langPaths.GetUpperBound(0)
        langPath = langPaths(Lang)

        'Create the lang folder
        Try
            rs.CreateFolder(langPath, "/" + parentFolder, Nothing)
            Console.WriteLine("Parent lang folder created: {0}", parentFolder + "/" + langPath)
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

        'Create the shared data source
        CreateDataSource("/" + parentFolder + "/" + langPath)

        'Publish reports and images
        PublishFolderContents(folder + "\" + langPath, "/" + parentFolder + "/" + langPath)
    Next 'Lang
End Sub

Public Sub CreateDataSource(ByVal targetFolder As String)
    Dim name As String = "data source"

    'Data source definition.
    Dim definition As New DataSourceDefinition
    definition.CredentialRetrieval = CredentialRetrievalEnum.Store
    definition.ConnectString = "data source=" + dbServer + ";initial catalog=" + db
    definition.Enabled = True
    definition.EnabledSpecified = True
    definition.Extension = "SQL"
    definition.ImpersonateUser = False
    definition.ImpersonateUserSpecified = True
    'Use the default prompt string.
    definition.Prompt = Nothing
    definition.WindowsCredentials = False
    'Login information
    definition.UserName = "user"
    definition.Password = "password"

    Try
    'name, folder, overwrite, definition, properties 
        rs.CreateDataSource(name, targetFolder, True, definition, Nothing)
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try

End Sub

Public Sub PublishFolderContents(ByVal sourceFolder As String, ByVal targetFolder As String)
    Dim di As New DirectoryInfo(sourceFolder)
    Dim fis As FileInfo() = di.GetFiles()
    Dim fi As FileInfo

    Dim fileName As String

    For Each fi In fis
        fileName = fi.Name
        Select Case fileName.Substring(fileName.Length - 4).ToUpper
            Case ".RDL"
                PublishReport(sourceFolder, fileName, targetFolder)
            Case ".JPG", ".JPEG"
                PublishResource(sourceFolder, fileName, "image/jpeg", targetFolder)
            Case ".GIF", ".PNG", ".BMP"
                PublishResource(sourceFolder, fileName, "image/" + fileName.Substring(fileName.Length - 3).ToLower, targetFolder)
        End Select
    Next fi
End Sub

Public Sub PublishReport(ByVal sourceFolder As String, ByVal reportName As String, ByVal targetFolder As String)
    Dim definition As [Byte]() = Nothing
    Dim warnings As Warning() = Nothing

    Try
        Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + reportName)
        definition = New [Byte](stream.Length) {}
        stream.Read(definition, 0, CInt(stream.Length))
        stream.Close()
    Catch e As IOException
        Console.WriteLine(e.Message)
    End Try

    Try
   'name, folder, overwrite, definition, properties 
        warnings = rs.CreateReport(reportName.Substring(0, reportName.Length - 4), targetFolder, True, definition, Nothing)

        If Not (warnings Is Nothing) Then
            Dim warning As Warning
            For Each warning In warnings
                Console.WriteLine(warning.Message)
            Next warning
        Else
            Console.WriteLine("Report: {0} published successfully with no warnings", targetFolder + "/" + reportName)
        End If
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try
End Sub

Public Sub PublishResource(ByVal sourceFolder As String, ByVal resourceName As String, ByVal resourceMIME As String, ByVal targetFolder As String)
    Dim definition As [Byte]() = Nothing
    Dim warnings As Warning() = Nothing

    Try
        Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + resourceName)
        definition = New [Byte](stream.Length) {}
        stream.Read(definition, 0, CInt(stream.Length))
        stream.Close()
    Catch e As IOException
        Console.WriteLine(e.Message)
    End Try

    Try
    'name, folder, overwrite, definition, MIME, properties 
        rs.CreateResource(resourceName, targetFolder, True, definition, resourceMIME, Nothing)
        Console.WriteLine("Resource: {0} with MIME {1} created successfully", targetFolder + "/" + resourceName, resourceMIME)
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try
End Sub

هنا هو دفعة إلى استدعاء rs.exe:

SET ReportServer=%1
SET DBServer=%2
SET DBName=%3
SET ReportFolder=%4

rs -i PublishReports.rss -s %ReportServer% -v dbServer="%DBServer%" -v db="%DBName%" -v parentFolder="%ReportFolder%" >PublishReports.log 2>&1

pause

نصائح أخرى

أنا استخدم البرنامج النصي @ديفيد زودت ولكن لدي إضافة بعض التعليمات البرمجية (أنا كتابة هذا كإجابة ، وهذا من شأنه أن تكون طويلة جدا للحصول على تعليق.

المشكلة هي:إذا كان هناك بالفعل "مشترك مصدر البيانات" تعلق على التقرير في التقرير تعريف هذا أبدا نفس مصدر البيانات الذي تم إنشاؤه في البرنامج النصي.

هذا أيضا يتضح من التحذير المنبعثة من "CreateReport" الطريقة:

مجموعة البيانات "يشير إلى مشترك مصدر البيانات" التي لا تنشر في الملقم التقرير.

لذا مصدر البيانات لابد من تعيين صراحة بعد ذلك.لقد جعلت التالية تغييرات في التعليمات البرمجية:

لقد تم إضافة متغير عمومي:

Dim dataSourceRefs(0) As DataSource

في نهاية CreateDataSource طريقة هذا المتغير يحصل شغل:

Dim dsr As New DataSourceReference
dsr.Reference = "/" + parentFolder + "/" + db
Dim ds As New DataSource
ds.Item = CType(dsr, DataSourceDefinitionOrReference)
ds.Name = db
dataSourceRefs(0) = ds

و في PublishReport الأسلوب ، أن مصدر البيانات يحصل صراحة (بعد CreateReport وقد دعا):

rs.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

علما أن هذا الأخير اتصل فقط RS 2005 أو أعلى.إذا كنت ترغب في تحميل التقارير الخاصة بك على RS 2000 server لديك لاستخدام مجموعةتقريرDataSources بدلا:

rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

كذلك لا حقا أنيقة.أنشأنا منطقتنا أداة تستخدم reportingservices2005 خدمة ويب.لقد وجدنا هذه الطريقة الأكثر موثوقية من الحصول على ما نريد.

انها ليست حقا أن من الصعب يتيح لك توسيع ذلك أن تفعل أشياء أخرى مثل إنشاء مصادر البيانات والمجلدات كما هو مطلوب.

وإنني أوصي بشدة RSScripter.كما لوحظ في نظرة عامة:

"خدمات التقارير" سيناريو هو .صافي نماذج Windows التطبيق الذي يتيح البرمجة و نقل جميع تقارير Microsoft SQL Server خدمات كتالوج عناصر للمساعدة في نقلها من الخادم إلى آخر.فإنه يمكن أيضا أن تستخدم بسهولة نقل العناصر على كتلة من التقارير خدمات مجلد إلى آخر في نفس الملقم.اعتمادا على البرمجة خيارات اختار, خدمات التقارير سيناريو يمكن أيضا نقل كل كتالوج البند خصائص مثل الوصف ، التاريخ الخيارات خيارات تنفيذ (بما في ذلك تقرير محددة ومشتركة جداول), الاشتراكات (عادي ، بيانات مدفوعة) و جانب الملقم التقرير المعلمات.

أنا أعلم أنك تقول أنك لست في صالح تطوير الأعمال استوديو للقيام بذلك ، ولكن وجدت المدمج في أدوات موثوق بها للغاية وسهلة الاستخدام.

هل نظرت إلى أي التكامل المستمر الحلول مثل CruiseControl.NET?إذا كنت قادرا على نشر التقارير باستخدام rs.exe ثم يمكنك إعداد عملية تلقائية في CruiseControl لبناء ونشر التقارير الخاصة بك على جهاز توقيت أو كلما التقرير هو المعدل.

في بيئتنا ، ونحن نطور في مباراة مع التحكم في الإصدار ثم نشر ديف SSRS.بمجرد تقرير التحقق من صحة نستخدم ReportSync البرنامج إلى نشر تقارير من ReportServer DEV إلى ReportServer PROD.على RS.EXE مخطوطات زال لها مكانها, ولكن وجدت ReportSync أن يكون أبسط من ذلك بكثير و رشيقة وسيلة لتعزيز التقرير.

ReportSync:

ReportSync هو برنامج مفتوح المصدر مجاني لتحميل والاستخدام.يعمل كبيرة لتحميل تقارير بكميات كبيرة ، حتى أنها يمكن أن تدفع إلى تقرير من ملقم واحد إلى ملقم آخر.


كيفية الحصول على تحميل البرنامج ؟

كيفية نشر التقرير ؟

  1. تشغيل الملف القابل للتنفيذ واجهة ستطلق.
  2. استخدام SOURCE و DESTINATION حوارات اختيار single report, multiple reports, أو entire folder of reports.يمكنك أي هدف مجلد تريد.(تلميح:يمكنك حتى الهدف نفس الخادم إذا كنت ترغب في تكرار التقرير على نفس الخادم.)
  3. بعد إجراء التحديدات اضغط على Sync button
  4. انتقل إلى الملقم الهدف ، والتحقق من التغيير حيز التنفيذ من خلال مراجعة غيرت التاريخ.

هذا وقد أداة مريحة للغاية ، لكنني لاحظت بعض المراوغات.على سبيل المثال when I want to update just one report that already exists in the destination, هنا هو ما يجب أن اختر-- [Source:Report> Target:Folder> Sync].تحذير:قد تعتقد أنك قد حدد الملقم الهدف التقرير إلى تحديث ، ولكن لقد حاولت هذا التقرير لا الحصول على تحديث.


ماذا يمكن أن ReportSync تفعل ؟

  • هناك أيضا Export الميزة التي تعمل بشكل رائع لمجرد إلقاء كل RDL الملفات إلى مجلد بالنسبة لي للوصول إلى.هذا مفيد في حال كنت تحتاج إلى ترحيل server ، إضافة الملفات إلى مقابل حل أو مشروع أو القيام بأي شيء آخر سوف جميع الملفات.

  • في اختبار هذا البرنامج لا ترحيل محتويات أخرى-- الاشتراكات المشتركة مصادر البيانات المشتركة مجموعات البيانات.هو فقط ينطبق على التقرير الملفات.

أعرف أن هذا المنصب هو قديم ولكن جئت عبر هذا عند البحث RS.EXE مخطوطات, لذلك فكرت في أن الإجابة على هذا السؤال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top