我在后端使用Postgres数据库来处理多个Web应用程序。这些应用程序托管在我有限访问权限的第三方服务器上。我目前使用npgsql和nhibernate来满足我的所有数据连接需求,这非常有用。
好吧,现在我需要写一些Crystal Reports。出于性能的考虑(并且因为结果数据不适合任何实体)我不能将我的nhibernate实体用作报告的数据源;同样,我无法为Crystal Reports创建ODBC连接,因为目标服务器上没有驱动程序或DSN。所以,我想,也许我可以根据我编写的查询构建数据集,并使用Npgsql数据提供程序填充它们,并将它们提供给Crystal Reports。我已经进行了概念验证,并且效果很好。
问题是,我有很多报告,还有很多要构建的数据集,而且在每个数据集中手动构建模式都非常耗时。数据集自动化接口不允许我在连接选择器中选择我的npgsql数据提供程序,这很烦人。
我希望有一种相当简单的方法可以在运行时通过npgsql数据提供程序将一些代码放在一起来获取数据集模式,然后将模式序列化为文件,然后我可以在设计时将其导入到我的报告项目中
这几乎可以做到吗?有没有更简单的方法?有很多报告和很多专栏,并且为它们手工编写模式将非常耗时。
答案 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。有了这个,我就能够构建我的结果集。