2017-07-19 2 views
2

Ich muss überprüfen, ob etwas in einer Tabelle (Tabelle 1) hinzugefügt wurde und wenn ja, muss ich einige Werte aus dieser Tabelle nehmen und sie in die zweite Tabelle einfügen (Tabelle 2) . Das Problem ist, dass die Tabelle 1 ist .DBF Provider = VFPOLEDB.1 durch OleDbConnection verbunden und die zweite Tabelle 2 ist MSSQL-Tabelle durch SqlConnection verbunden.C# zwei Ergebnisse von zwei verschiedenen Datenbankanbietern kombinieren

Ich möchte so etwas machen: SELECT column1 FROM Tabelle1 WHERE column1 NOT IN (SELECT column2 FROM Tabelle 2)

Ist es möglich, dies zu tun? Ich kann beide Tabellen auf die Datagridview laden, indem Sie:

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]; 

    } 

für OleDbConnection und tun:

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]; 

    } 

für SqlConnection. Mayby Ich kann 2 Datensätze oder so etwas wie temporäre Tabellen aus dieser Abfrage machen? also wird es so sein? :

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

Antwort

0

Da beide Datentabellen sind aus verschiedenen Quellen, die Sie beiden Datentabellen in den Speicher holen müssen und dann Linq zu Datenmenge verwenden. etwas wie das

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; 
+0

Vielen Dank für die Antwort. Ich werde das testen, aber ich habe Linq nie zuvor benutzt. Kannst du mir das weiter erklären? Wie kann ich es verwenden, welchen Provider oder DataAdapter soll ich verwenden, um Dataset zu füllen? Ich möchte das in neuem DataGridView zeigen. – RobaQ

+0

Sie haben bereits 2 Methoden, um datatables.get 2 Databases mit diesen Methoden zu bekommen und dann linq query gibt Ihnen die gewünschten Daten.Finally binden Sie die Abfrage an Ihr Datagrid. – ClearLogic

+0

ok, aber wenn ich mache: 'dvgTest.DataSource = datatable1;' Ich bekomme ein DataTable1-Ergebnis und es ist in Ordnung. Gleiches gilt für Datatable2. Aber wenn ich in LINQ etwas einfacher mache: 'var query = von c in datatable2.AsEnumerable() select c; dvgTest.DataSource = Abfrage; ' Ich werde keine Ergebnisse erhalten. Warum? – RobaQ

Verwandte Themen