【问题标题】:c# combine two results from two different database providersc# 合并来自两个不同数据库提供者的两个结果
【发布时间】:2017-07-20 22:15:45
【问题描述】:

我需要检查是否在一个表(表 1)中添加了某些内容,如果是,我需要从该表中获取一些值并将其插入到第二个表(表 2)中。 问题是表1是.DBF Provider=VFPOLEDB.1,通过OleDbConnection连接,第二个表2是MSSQL表,通过SqlConnection连接。

我想做这样的事情: SELECT column1 FROM Table1 WHERE column1 NOT IN (SELECT column2 FROM Table2)

可以这样做吗?我可以通过执行以下操作将两个表加载到 datagridview:

public static DataTable GetDataTableDBF(string strFileName)

    {

        OleDbConnection conFOX = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=" + Path.GetFullPath(strFileName).Replace(Path.GetFileName(strFileName), "") + ";Exclusive=No");

        conFOX.Open();

        string strQuery = "SELECT * FROM [" + Path.GetFileName(strFileName) + "]";

        OleDbDataAdapter adapter = new OleDbDataAdapter(strQuery, conFOX);

        DataSet ds = new DataSet();

        adapter.Fill(ds);

        return ds.Tables[0];

    }

对于 OleDbConnection 和做:

public static DataTable GetDataTableSQL(string TableName)

    {

        SqlConnection conSQL = new SqlConnection(connection);
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();

        conSQL.Open();

        string strQuery = "SELECT * FROM " + TableName;
        da.SelectCommand = new SqlCommand(strQuery, conSQL);

        da.Fill(ds);

        return ds.Tables[0];

    }

对于 SqlConnection。 Mayby 我可以从这个查询中做 2 个数据集或类似临时表的东西吗?所以会是这样的吗? :

SELECT dataset1.column1 FROM dataset1 WHERE dataset1.column1 NOT IN (SELECT dataset2.column2 FROM dataset2) 

【问题讨论】:

    标签: c#


    【解决方案1】:

    由于两个数据表来自不同的来源,您需要将两个数据表都提取到内存中,然后使用 linq 进行数据集。像这样的

        var datatable1 = GetDataTableDBF("filename");
        var datatable2 = GetDataTableSQL("tablename");
    
        var query = from c in dataset1.AsEnumerable()
                    where !(from o in dataset2.AsEnumerable()
                            select o.Field<int>("column2")).Contains(c.Field<int>("column1"))
                    select c;
    
        var filteredDataTable1 = query.CopyToDataTable();
    
        var resultDataTable = filteredDataTable1.DefaultView.ToTable(false, "column1"); //create new table with only 1 column
    
        dataGridView1.DataSource = resultDataTable;
    

    【讨论】:

    • 感谢您的回答。我会对此进行测试,但我之前从未使用过 Linq,所以你能进一步解释一下吗?我该如何使用它,我应该使用什么提供者或 DataAdapter 来填充数据集?我想在新的 DataGridView 中显示该结果。
    • 您已经有 2 种获取数据表的方法。使用这些方法获取 2 个数据表,然后 linq 查询将为您提供所需的数据。最后将查询绑定到您的数据网格。
    • 好的,但是当我制作时:'dvgTest.DataSource = datatable1;'我得到一个 DataTable1 结果,没关系。与datatable2相同。但是当我在 LINQ 中简化一些事情时:'var query = from c in datatable2.AsEnumerable() select c; dvgTest.DataSource = 查询;'我不会得到任何结果。为什么?
    • 对不起,但我发现我没有将 .ToList() 放在查询的末尾。当我输入 query.ToList() 时,我会通过列标题获得结果,例如:RowError、RowState、Table、HasError。为什么?
    • 我已经更新了答案。你应该创建数据表而不是列表。
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多