"在客户端" DataTable SQL查询

时间:2018-06-14 15:08:35

标签: .net sql-server ms-access ado.net

我正在针对我们的WCMS软件的几个实例运行sql查询,这些实例都具有相当统一的架构,但仍然存在于未连接的sql server实例上。我需要针对所有实例运行查询以生成一个数据表并对该聚合表运行查询。基本上是map-reduce查询的.net / sql风格。

我已经完成了第一部分,我可以针对所有实例运行查询并将其聚合到一个DataTable中。但我不确定如何在该表上运行reduce查询。我不相信ado.net有一种对数据表运行sql查询的方法。 (希望我在那部分错了?)我考虑过的一种方法是将数据表作为临时表插入其中一个sql server实例然后对它运行查询,但这似乎是错误的。我宁愿在客户端运行reduce(一个最终吐出csv文件的控制台应用程序)。

我想知道是否有办法让Access / Jet成为我可以查询的临时客户端数据库...

1 个答案:

答案 0 :(得分:0)

此功能似乎有效

    private static DataTable query_as_table(string[] columns, DataRow[] rows, string sql)
    {
        var fileName = Path.GetTempFileName();

        File.Delete(fileName);

        var tempConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName +
                                   "; Jet OLEDB:Engine Type=5";
        var cat = new Catalog();
        cat.Create(tempConnectionString);
        var table = new Table();
        table.Name = "mapped";

        var datatable = new DataTable();

        foreach (var col_name in columns)
        {
            table.Columns.Append(col_name);
            datatable.Columns.Add(col_name);
        }
        foreach (var data_row in rows)
        {
            datatable.ImportRow(data_row);
        }
        foreach (var data_row in datatable.Rows.Cast<DataRow>())
        {
            data_row.AcceptChanges();
            data_row.SetAdded();
        }
        cat.Tables.Append(table);


        var conn = new OleDbConnection();
        conn.ConnectionString = tempConnectionString;
        conn.Open();

        var adapter = new OleDbDataAdapter("select * from mapped", conn);

        var cbr = new OleDbCommandBuilder(adapter);
        cbr.QuotePrefix = "[";
        cbr.QuoteSuffix = "]";
        cbr.GetInsertCommand(true);
        adapter.Update(datatable);

        var adapter2 = new OleDbDataAdapter(sql, conn);
        var ds = new DataSet();
        adapter2.Fill(ds);
        conn.Close();

        var resultTable = ds.Tables[0];
        return resultTable;
    }