簡體   English   中英

從查詢生成.NET DataSet文件?

[英]Generate .NET DataSet file from a query?

我將Postgres數據庫用於多個Web應用程序的后端。 這些應用程序托管在我訪問受限的第三方服務器上。 我目前使用npgsql和nhibernate滿足所有數據連接需求,並且效果很好。

好吧,現在我需要編寫一些Crystal Reports。 出於性能的考慮(並且由於結果數據無法放入任何實體中),我不能將nhibernate實體用作報表的數據源; 同樣,我無法為Crystal Reports創建ODBC連接,因為目標服務器上沒有驅動程序或DSN。 因此,我想,也許我可以根據編寫的查詢來構建數據集,並使用Npgsql數據提供程序填充它們,並將其提供給Crystal Reports。 我已經進行了概念驗證,並且效果很好。

問題是,我有很多報告和大量數據集要構建,而在每個模型中手動構建模式都非常耗時。 數據集自動化接口不允許我在連接選擇器中選擇我的npgsql數據提供程序,這很煩人。

我希望有一種相當簡單的方法,可以在運行時通過npgsql數據提供程序將一些代碼組合在一起以獲取數據集架構,然后將該架構序列化為文件,然后在設計時將其導入到我的報表項目中。

實際上可以做到嗎? 有更容易的方法嗎? 有大量的報告和許多列,為它們手動編碼模式將非常耗時。

數據集自動化界面不會讓我選擇我的npgsql數據提供程序

任何.NET數據提供程序都必須在DDEX中注冊才能在Visual Studio設計器中得到支持(盡管對於使用特定的提供程序來構建和運行應用程序,這不是必需的)。

還有就是關於類似的問題npgsql ,但它近2歲。
也許,自2011年以來發生了一些變化,因為官方文檔

2.2安裝二進制包

...
請注意,Visual Studio .Net中的Npgsql設計時間支持需要將Npgsql放入GAC。

這就是我最終要做的。

我制作了一個快速的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。 這樣我就可以建立我的結果集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM