Excel工作表和MS Access表加入visual studio C#

Excel工作表和MS Access表加入visual studio C#,c#,sql,excel,ms-access,datatable,C#,Sql,Excel,Ms Access,Datatable,我有名为mer\u SVC的excel表和名为GIS的MS Access数据库表。我想根据字段账号查找不匹配项。我通过在Access表中导入excel表,从设计视图生成了sql查询(如下所示) 我使用Visual studio 2015在datagrid视图中显示输出。现在使用两个OleDbConnection如何生成上述查询。 查询语法错误即将出现 string stringconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +

我有名为
mer\u SVC
的excel表和名为
GIS
的MS Access数据库表。我想根据字段
账号
查找不匹配项。我通过在Access表中导入excel表,从设计视图生成了sql查询(如下所示)

我使用Visual studio 2015在datagrid视图中显示输出。现在使用两个OleDbConnection如何生成上述查询。 查询语法错误即将出现

string stringconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + 
                     textselect.Text + ";" + "Extended Properties='Excel 8.0;HDR=YES;'"; 
OleDbConnection conn = new OleDbConnection(stringconn);

string stringcon = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source = 
                   C:\Users\GIS\Documents\Match.accdb;";
OleDbConnection conn1 = new OleDbConnection(stringcon);

string path = @"F:\RAEC\RAECOEXCEL\Customer Data from CRM -
                Copy.XLSX" + " Excel 8.0";  

string query = "Select * from [mer_SVC$] IN" + path + " LEFT JOIN 
                GIS ON Account No From [mer_SVC$] IN" + "path " + " = 
                GIS.[Account No] WHERE (((GIS.[Account No]) Is Null))";

OleDbDataAdapter da = new OleDbDataAdapter(query, conn1);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

那真是有点好玩!首先,我不认为你可以按照你希望的方式来做,因为OleDbAdapter一次只能连接一个连接。然而,你可以通过分阶段完成你想要的

首先创建两个数据表,一个来自Access,另一个来自Excel。然后将它们转换成一个键入的列表。接下来使用一点LINQ来获取缺少的行。最后根据结果构建一个新的数据表

总而言之,它应该是这样的:

private struct GIS
{
    public int AccountNo;
    public string AccountName;
}
private void Test()
{

    try
    {
        string xlConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\jonat\Documents\TestCSharp.xlsx;Extended Properties='Excel 8.0;HDR=Yes;';";
        var xlConn = new OleDbConnection(xlConnStr);

        var da = new OleDbDataAdapter("SELECT * FROM [mer_SVC$]", xlConn);
        var xlDT = new DataTable();
        da.Fill(xlDT);

        List<GIS> xl = xlDT.AsEnumerable().Select(g => new GIS()
        {
            AccountNo = (int)g.Field<double>("Account No"),
            AccountName = g.Field<string>("Account Name")
        }).ToList();

        string acConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\Users\jonat\Documents\PricingTools.accdb;Jet OLEDB:Engine Type=5;Persist Security Info=False;";

        var acConn = new OleDbConnection(acConnStr);
        da = new OleDbDataAdapter("SELECT * FROM GIS", acConn);
        var acDT = new DataTable();
        da.Fill(acDT);

        List<GIS> ac = acDT.AsEnumerable().Select(g => new GIS()
        {
            AccountNo = g.Field<int>("Account No"),
            AccountName = g.Field<string>("Account Name")
        }).ToList();

        var missing = xl.Where(x => !ac.Any(a => a.AccountNo == x.AccountNo));
        DataTable dt = acDT.Clone();
        foreach (var m in missing)
        {
            var n = dt.NewRow();
            n["Account No"] = m.AccountNo;
            n["Account Name"] = m.AccountName;
            dt.Rows.Add(n);
        }

        dataGridView1.DataSource = dt;

    }
    catch (Exception ex)
    {
        MessageBox.Show("Exception thrown; " + ex.Message);
    }
}

那真是有点好玩!首先,我不认为你可以按照你希望的方式来做,因为OleDbAdapter一次只能连接一个连接。然而,你可以通过分阶段完成你想要的

首先创建两个数据表,一个来自Access,另一个来自Excel。然后将它们转换成一个键入的列表。接下来使用一点LINQ来获取缺少的行。最后根据结果构建一个新的数据表

总而言之,它应该是这样的:

private struct GIS
{
    public int AccountNo;
    public string AccountName;
}
private void Test()
{

    try
    {
        string xlConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\jonat\Documents\TestCSharp.xlsx;Extended Properties='Excel 8.0;HDR=Yes;';";
        var xlConn = new OleDbConnection(xlConnStr);

        var da = new OleDbDataAdapter("SELECT * FROM [mer_SVC$]", xlConn);
        var xlDT = new DataTable();
        da.Fill(xlDT);

        List<GIS> xl = xlDT.AsEnumerable().Select(g => new GIS()
        {
            AccountNo = (int)g.Field<double>("Account No"),
            AccountName = g.Field<string>("Account Name")
        }).ToList();

        string acConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\Users\jonat\Documents\PricingTools.accdb;Jet OLEDB:Engine Type=5;Persist Security Info=False;";

        var acConn = new OleDbConnection(acConnStr);
        da = new OleDbDataAdapter("SELECT * FROM GIS", acConn);
        var acDT = new DataTable();
        da.Fill(acDT);

        List<GIS> ac = acDT.AsEnumerable().Select(g => new GIS()
        {
            AccountNo = g.Field<int>("Account No"),
            AccountName = g.Field<string>("Account Name")
        }).ToList();

        var missing = xl.Where(x => !ac.Any(a => a.AccountNo == x.AccountNo));
        DataTable dt = acDT.Clone();
        foreach (var m in missing)
        {
            var n = dt.NewRow();
            n["Account No"] = m.AccountNo;
            n["Account Name"] = m.AccountName;
            dt.Rows.Add(n);
        }

        dataGridView1.DataSource = dt;

    }
    catch (Exception ex)
    {
        MessageBox.Show("Exception thrown; " + ex.Message);
    }
}

在两个INs之后至少需要一些空格。我现在下班了,现在是晚上8点25分,但你们当中有人还没修好,我明天早上再试试。你试过了吗?对不起,被拖走了!现在来看,至少在两个INs之后需要空格。我现在下班了,现在是晚上8点25分,但你们当中有人还没修好,我明天早上再试试。你试过了吗?对不起,被拖走了!现在看看,我很乐意。很高兴得到帮助Dear Jonathan,我想修改查询。在access表中,我有一个status列,希望查询不匹配,其中帐号相等,status=yes。我试过使用and运算符,但不工作。很高兴得到帮助Dear Jonathan,我想修改查询。在access表中,我有一个status列,希望查询不匹配,其中帐号相等,status=yes。我试过使用和操作员,但没有工作