从查询生成.NET DataSet文件?

时间:2013-11-12 04:52:47

标签: c# postgresql crystal-reports strongly-typed-dataset npgsql

我在后端使用Postgres数据库来处理多个Web应用程序。这些应用程序托管在我有限访问权限的第三方服务器上。我目前使用npgsql和nhibernate来满足我的所有数据连接需求,这非常有用。

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

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

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

这几乎可以做到吗?有没有更简单的方法?有很多报告和很多专栏,并且为它们手工编写模式将非常耗时。

2 个答案:

答案 0 :(得分:1)

  

数据集自动化界面不允许我选择我的npgsql数据提供程序

任何.NET数据提供程序必须在DDEX内注册才能在Visual Studio设计器中受支持(尽管使用特定提供程序构建和运行应用程序时不需要这样做。)

npgsql类似问题{{1}},但差不多有2年了 也许,自2011年以来发生了一些变化,因为官方文档was

  

2.2安装二进制包

     

...
  请注意,Npgsql设计需要将Npgsql放在GAC中   Visual Studio .Net中的时间支持。

答案 1 :(得分: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。有了这个,我就能够构建我的结果集。