返回

CentOS FastReport.Mono 连接 MS SQL Server 报表生成指南

Linux

CentOS 上使用 FastReport.Mono 连接 MS SQL 数据库生成报表

在使用 FastReport.Mono 开发报表应用时,你可能会遇到在 CentOS 上无法直接连接到 MS SQL 数据库的问题,错误提示为 "Cant find object MsSqlDataConnection"。别着急,咱们一起看看怎么解决。

一、问题原因

根据错误信息和 FastReport 的功能对比表,我们可以确定问题出在哪儿了: FastReport.Mono 本身不直接支持连接到 MS SQL 数据库。 它的功能列表中明确指出,像 MS SQL、ODBC 等数据库连接,在 FastReport.Mono 中是不提供的。

但,既然能在 Wine 环境下通过 Windows 版的 FastReport 成功连接 MS SQL,那就说明从 CentOS 访问 MS SQL 数据库是可行的。只是我们需要换种方式来实现。

二、解决方案

既然 FastReport.Mono 不能直接连接 MS SQL,那么我们的思路就是:先让其他工具去连接数据库,然后把数据"喂"给 FastReport.Mono。可以试试以下几种方法:

1. 使用 System.Data.SqlClient + 自定义数据集

这是比较灵活的方式。

原理:

Mono 环境下,我们可以用 System.Data.SqlClient 这个库直接与 MS SQL 数据库通信。自己写代码查询数据,然后把数据封装成 FastReport 能识别的格式(比如 DataSet、DataTable)。

代码示例:

using System;
using System.Data;
using System.Data.SqlClient;
using FastReport;

public class ReportGenerator
{
    public static void GenerateReport()
    {
        // 数据库连接字符串
        string connectionString = "Server=your_server_address;Database=your_database;User Id=your_user;Password=your_password;";

        // SQL 查询语句
        string query = "SELECT * FROM YourTable";

        // 创建 DataSet 和 DataTable
        DataSet dataSet = new DataSet();
        DataTable dataTable = new DataTable("YourTable"); // 表名与报表中的数据源名称对应

        // 使用 SqlConnection 和 SqlDataAdapter 获取数据
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
            adapter.Fill(dataTable);
        }
        //将datatable加入dataset
        dataSet.Tables.Add(dataTable);

        // 加载报表模板
        Report report = new Report();
        report.Load("your_report.frx");

        // 注册数据源
        report.RegisterData(dataSet, "YourDataSourceName"); // "YourDataSourceName" 与报表文件中的数据集名称对应

        // 准备并导出报表
        report.Prepare();
        // report.Show(); //可以选择直接展示
        report.Export(new FastReport.Export.Pdf.PDFExport(), "output.pdf");
        
    }
}

操作步骤:

  1. 安装 System.Data.SqlClient NuGet 包 (如果还没有的话)。 在项目文件夹,可以使用dotnet add package System.Data.SqlClient
  2. 修改代码中的连接字符串、SQL 查询语句和报表文件名。
  3. 确保报表模板 (your_report.frx) 中的数据源名称与代码中注册的数据源名称一致。
  4. 确保 your_report.frxDataBand 绑定了数据表名称 YourTable

安全建议:

  • 不要把数据库连接字符串直接写在代码里! 建议使用配置文件 (比如 appsettings.json) 或环境变量来存储敏感信息。
  • 对 SQL 查询语句进行参数化处理,避免 SQL 注入攻击。

2. 使用 FreeTDS + ODBC + System.Data.Odbc

如果你的环境或者你的强项在于ODBC, 这种方法可以通过 ODBC 桥接来访问 MS SQL 数据库。

原理:

FreeTDS 是一个开源的库,允许 Linux/Unix 系统连接到 MS SQL Server。我们可以通过 FreeTDS 配置 ODBC 数据源,然后在 FastReport.Mono 中使用 System.Data.Odbc 来连接。

安装和配置 FreeTDS & ODBC :

  1. 安装 FreeTDS 和 unixODBC:

    sudo yum install freetds unixODBC
    
  2. 配置 FreeTDS (/etc/freetds.conf~/.freetds.conf):

    [your_server_alias]
        host = your_server_address
        port = 1433  # 或者其他端口
        tds version = 7.4  # 尝试不同版本,比如 7.0, 7.2, 7.3, 8.0
        client charset = UTF-8 #按需更改编码
    
  3. 配置 ODBC 数据源 (/etc/odbc.ini~/.odbc.ini):

    [your_dsn]
        Driver = FreeTDS
        Servername = your_server_alias  # 与 freetds.conf 中的 alias 对应
        Database = your_database
        UID = your_user
        PWD = your_password
    
    
  4. 配置 ODBC 驱动 (/etc/odbcinst.ini~/.odbcinst.ini):
    确认是否有以下类似的设置:
    ```
    [FreeTDS]
    Description = TDS driver (Sybase/MS SQL)
    Driver = /usr/lib64/libtdsodbc.so #具体的 .so 文件的路径可能有区别
    Setup = /usr/lib64/libtdsS.so #具体的 .so 文件的路径可能有区别
    FileUsage = 1

    ```
    

    如果没有,就新增进去。如果有相似的设置,注意修改Driver 为实际.so文件的路径。

  5. 测试配置

      isql -v your_dsn
    

代码示例:

using System;
using System.Data;
using System.Data.Odbc;
using FastReport;

public class ReportGenerator
{
    public static void GenerateReport()
    {
        // ODBC 连接字符串
        string connectionString = "DSN=your_dsn";

        // SQL 查询语句
        string query = "SELECT * FROM YourTable";

        // 创建 DataSet
        DataSet dataSet = new DataSet();
        DataTable dataTable = new DataTable("YourTable"); //表名

        // 使用 OdbcConnection 和 OdbcDataAdapter 获取数据
        using (OdbcConnection connection = new OdbcConnection(connectionString))
        {
            OdbcDataAdapter adapter = new OdbcDataAdapter(query, connection);
           
            adapter.Fill(dataTable);
             
        }
        
        dataSet.Tables.Add(dataTable);
        // 加载报表模板
        Report report = new Report();
        report.Load("your_report.frx");

        // 注册数据源
        report.RegisterData(dataSet, "YourDataSourceName");

        // 准备并导出报表
        report.Prepare();
        report.Export(new FastReport.Export.Pdf.PDFExport(), "output.pdf");
    }
}

操作步骤:

  1. 安装并配置 FreeTDS 和 unixODBC.
  2. 测试 ODBC 连接 (isql -v your_dsn).
  3. 安装System.Data.Odbc NuGet 包 (如果没有)。
  4. 修改代码中的连接字符串、查询语句等.
  5. 确保报表模板正确设置数据源.

安全建议:

  • 与方法一类似,避免在代码中直接存储敏感信息。
  • 定期更新 FreeTDS 和 unixODBC,以获取最新的安全补丁。

3. 进阶技巧:预编译报表

如果你的报表模板不经常变动,可以考虑预编译报表,以提高性能。

  1. 在 Windows 环境下编译报表:
    用 FastReport Designer(Windows 版本)打开报表文件 (.frx),然后选择 "File" -> "Compile Report"。这将会生成一个编译后的报表文件 (.fpx)。

  2. 在 CentOS 上加载编译后的报表:
    在 C# 代码中,使用 report.LoadPrepared() 方法加载 .fpx 文件, 而不是 report.Load()

   report.LoadPrepared("your_report.fpx");

这样做的好处是,在 CentOS 上运行时,FastReport 不需要再进行报表编译,从而提高运行效率。
在Windows 端完成了所有报表相关的设计和复杂操作后,拿到CentOS 来直接使用, 会大大提高报表的执行效率。

三、总结

在 CentOS 上使用 FastReport.Mono 生成 MS SQL 数据库报表,虽然不能直接连 MS SQL, 但我们可以借助其他工具, 先把数据查询出来,再 “喂” 给 FastReport.Mono 进行处理. 选择哪种方法,可以根据实际情况,比如哪种方式你最熟悉,或者哪种方式在你的环境中配置起来最方便. 希望这些内容能帮你搞定问题!