PrintReportWithOdbcSource

Implementacja: PrintReportWithOdbcSource

Opis scenariusza biznesowego

Klasa demonstracyjna PrintReportWithOdbcSource prezentuje implementację uniwersalnego zasilania danych z wykorzystaniem interfejsu standardu ODBC (Open Database Connectivity). Model ten jest kluczowy w systemach przedsiębiorstw, gdzie zachodzi potrzeba generowania wydruków na podstawie rozproszonych źródeł danych nieposiadających dedykowanych, natywnych sterowników ADO.NET.

W analizowanym przykładzie kod demonstruje pobieranie danych za pośrednictwem zdefiniowanego w systemie operacyjnym Windows źródła danych DSN (Data Source Name) o nazwie testaaa. Zapytanie SQL nakierowane na obiekt Arkusz1$ bezpośrednio wskazuje na scenariusz, w którym sPrint API traktuje arkusz kalkulacyjny pliku MS Excel lub plik płaski jako zewnętrzną, relacyjną tabelę bazy danych.


Analiza modelu i struktury żądania ODBC

W odróżnieniu od natywnego dostawcy bazodanowego (DbSourceViewModel), model OdbcSourceViewModel upraszcza strukturę żądania sieciowego, agregując parametry sieciowe wewnątrz jednego ciągu konfiguracyjnego:

  • ConnectionString (Ciąg połączenia): Zamiast rozbijać parametry na Server, Port i DatabaseName, deweloper przekazuje gotowy ciąg autoryzacyjny standardu ODBC. Może on odwoływać się do skonfigurowanego w systemie profilu (np. DSN=testaaa) lub zawierać pełną definicję sterownika i ścieżki pliku (Driver-Based Connection String).
  • Query (Zapytanie strukturalne): Treść zapytania SQL dostosowana do dialektu sterownika ODBC, który zarządza plikiem źródłowym lub bazą danych.

Pełny kod źródłowy przykładu (C#)

Poniższy kod prezentuje kompletną, asynchroniczną strukturę klasy PrintReportWithOdbcSource zrealizowaną na platformie .NET 8, z wykorzystaniem polimorficznych modeli ścieżkowych (Path Methodology):

using Comarch.BI.CounterSprint.Integration.Client;

namespace Comarch.BI.CounterSprint;

public static class PrintReportWithOdbcSource
{
    private static readonly string ReportPath = Path.GetFullPath(@"Packages\OdbcSource\CounterSprintOdbcMain.sp");
    private static readonly string PrintResultPath1 = Path.GetFullPath(@"Packages\OdbcSource\CounterSprintOdbcMain1.pdf");
    
    /// <summary>
    /// Demonstration method: prints a report using file paths as sources and ODBC connection.
    /// </summary>
    public static async Task PrintReportFromPath(IntegrationApiClient client)
    {
        var operationId = Guid.NewGuid().ToString();
        LogStep($"Retrieving report information, operation ID: {operationId}");
        var infoRequest = CreateInfoRequestFromPath(operationId);
        var info = await client.InfoAsync(infoRequest);

        LogStep($"Printing report to PDF, operation ID: {operationId}");
        var printRequest = CreatePrintRequestFromPath();
        await client.PrintAsync(printRequest);
        LogStep($"Report saved to {PrintResultPath1}");
    }
    
    private static PrintViewModel CreatePrintRequestFromPath()
        => new ()
        {
            OperationId = Guid.NewGuid().ToString(),
            Report = new PathSourceViewModel { Path = ReportPath },
            PrintFormat = FileFormat.Pdf,
            Output = new PathOutputViewModel { Path = PrintResultPath1 },
            DataSources = [new OdbcSourceViewModel()
            {
                ConnectionString = "DSN=testaaa", // Nazwa profilu systemowego ODBC (DSN)
                Query = "Select * from \"Arkusz1$\"",  // Zapytanie SQL dedykowane dla struktury ODBC
            }],
            Parameters = [new ParameterToReplaceViewModel
            {
                Name = "group_name",
                Value = "Furniture"
            }]
        };
    
    private static InfoViewModel CreateInfoRequestFromPath(string operationId)
        => new ()
        {
            OperationId = operationId,
            Report = new PathSourceViewModel { Path = ReportPath }
        };
    
    private static void LogStep(string message)
        => Console.WriteLine($"[Demo PrintReportWithOdbcSource] {message}");
}

Ważne uwagi dla deweloperów i administratorów

  • Konfiguracja środowiskowa (System DSN): Ponieważ usługa sPrint API działa jako niezależna usługa systemowa Windows Service, profil źródła danych ODBC musi być bezwzględnie zdefiniowany jako System DSN (a nie User DSN) w systemowym administratorze narzędzi ODBC Data Source Administrator. Profil zdefiniowany na poziomie użytkownika (User DSN) nie będzie widoczny dla procesu sPrint API.
  • Architektura bitowa sterowników (64-bit vs 32-bit): sPrint API jest nowoczesną aplikacją 64-bitową. Oznacza to, że konfigurując profil systemowy DSN, należy użyć 64-bitowej wersji konfiguratora ODBC (standardowo zlokalizowanego w C:\Windows\System32\odbcad32.exe) oraz upewnić się, że zainstalowane w systemie sterowniki (np. Microsoft Excel Driver) są również w wersji 64-bitowej.
  • Wstrzykiwanie parametrów (ParametersScope): Pomimo specyfiki warstwy ODBC, wstrzykiwanie zmiennych biznesowych odbywa się w sposób identyczny jak w przypadku natywnych baz SQL – silnik sPrint przed wywołaniem interfejsu ODBC podmienia parametry zdefiniowane w tablicy Parameters na wartości produkcyjne (w tym przypadku filtrowanie rekordów dla grupy Furniture).

Czy ten artykuł był pomocny?