0

我为多个 Web 应用程序的后端使用 Postgres 数据库。这些应用程序托管在我访问受限的第三方服务器上。我目前使用 npgsql 和 nhibernate 来满足我所有的数据连接需求,而且效果很好。

好吧,现在我需要编写一些水晶报表。出于性能考虑(并且因为结果数据不适合任何实体)我不能使用我的休眠实体作为报告的数据源;同样,我无法为 Crystal Reports 创建 ODBC 连接,因为目标服务器上没有驱动程序或 DSN。所以,我想,也许我可以根据我编写的查询构建数据集,并使用 Npgsql 数据提供程序填充它们,然后将它们提供给 Crystal Reports。我已经进行了概念验证,并且效果很好。

问题是,我有很多报告和很多数据集要构建,并且在每个中手动构建模式非常耗时。数据集自动化接口不允许我在连接选择器中选择我的 npgsql 数据提供程序,这很烦人。

我希望有一种相当简单的方法可以在运行时通过 npgsql 数据提供程序将一些代码组合在一起以获取数据集模式,然后将模式序列化为文件,然后我可以在设计时将其导入我的报告项目中。

这实际上可以做到吗?有没有更简单的方法?有一堆报告和很多列,为它们手动编码模式将非常耗时。

4

2 回答 2

1

The dataset automation interfaces won't let me choose my npgsql data provider

Any .NET data provider must be registered within DDEX to be supported in Visual Studio designers (although, this is not necessary for using particular provider for building and running applications).

There was similar question about npgsql, but it almost 2 years old.
Maybe, something changed since 2011, because official documentation says:

2.2 Installing binary package

...
Note that placing Npgsql in the GAC is required for Npgsql design time support in Visual Studio .Net.

于 2013-11-12T05:25:22.580 回答
0

这就是我最终做的事情。

我制作了一个带有三个多行文本框和一个按钮的快速 WinForms 小应用程序。按钮单击事件附加了以下代码:

        var query = txtQuery.Text;
        var connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;

        try
        {
            string data;
            string schema;
            GetSchema(connectionString, query, out data, out schema);
            txtXML.Text = data;
            txtXSD.Text = schema;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

GetSchema方法如下所示:

    private void GetSchema(string connectionString, string query, out string data, out string schema)
    {
        using (var conn = new Npgsql.NpgsqlConnection(connectionString))
        using (var da = new Npgsql.NpgsqlDataAdapter(query, conn))
        using (var ds = new DataSet())
        using (var dataStream = new MemoryStream())
        using (var schemaStream = new MemoryStream())
        {
            conn.Open();
            da.Fill(ds);
            ds.WriteXml(dataStream);
            ds.WriteXmlSchema(schemaStream);
            dataStream.Position = 0;
            schemaStream.Position = 0;
            using (var dataReader = new StreamReader(dataStream))
            using (var schemaReader = new StreamReader(schemaStream))
            {
                data = dataReader.ReadToEnd();
                schema = schemaReader.ReadToEnd();
            }
        }
    }

当我运行它时,我得到了我的数据 XML 和我的模式 XML。有了这个,我能够构建我的结果集。

于 2013-11-12T12:55:09.917 回答