2013-07-24 18 views
0

我有兩個數據集,我從Access數據庫的兩個表中讀取數據。我希望能夠通過EXPRESSION匹配數據,以便保持所有匹配的「SN」,並去除那些沒有匹配的數據。到目前爲止,我的代碼保留了所有的「SN」。這是,從查詢中獲取匹配,但不保留其他任何東西

con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+filePath); 
con3 = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+filePath); 

if ((string)comboBox1.SelectedItem == "CGA0112") 
{ 
    try 
    { 
     string end = "ENDDATE"; 
     string qual = "CGA0112"; 
     string start = "START"; 

     ad.SelectCommand = new OleDbCommand("SELECT b.RSV_CAT, b.SEQNUM, b.LEASE, 
          b.WELL_ID, a.QUALIFIER, a.KEYWORD, a.EXPRESSION 
          FROM [AC_ECONOMIC] a INNER JOIN [AC_PROPERTY] b 
           on a.PROPNUM=b.PROPNUM WHERE a.KEYWORD = '" +end+ "' 
        AND a.QUALIFIER = '" +qual+ "' AND a.EXPRESSION LIKE 'SN%'", con); 

     ds.Clear(); 
     ad.Fill(ds); 

     con.Open(); 
     ad.SelectCommand.ExecuteNonQuery(); 
     con.Close(); 

     ad3.SelectCommand = new OleDbCommand("SELECT b.RSV_CAT, b.SEQNUM, b.LEASE, 
           b.WELL_ID, a.QUALIFIER, a.KEYWORD, a.EXPRESSION 
           FROM [AC_ECONOMIC] a INNER JOIN [AC_PROPERTY] b 
           on a.PROPNUM=b.PROPNUM 
           WHERE a.KEYWORD = '" + start + "' AND a.QUALIFIER = '" + 
           qual + "' AND a.EXPRESSION LIKE 'SN%'", con3); 
     ds3.Clear(); 
     ad3.Fill(ds3); 

     ds.Merge(ds3); //merges the two datasets together 

     win1.frm1 = this; 
     win1.Show(); 

     con3.Open(); 
     ad3.SelectCommand.ExecuteNonQuery(); 
     con3.Close(); 
    } 

我在想,如果有一個可能解決這一所以只保留匹配的表達。任何幫助深表感謝。謝謝。

+0

而不是合併數據集,你可以使用LINQ Join對行集合嗎? –

+0

@CjS。我不知道我會如何去做這件事。 – Stick

+0

我添加了一個例子作爲答案。應該讓你相當接近。 –

回答

0

下面是一個例子。由於「SN456」出現在兩個表中,所以在結果中選擇它。

 var ds = new DataSet(); 
     var table1 = ds.Tables.Add("Table1"); 
     table1.Columns.Add("Expression", typeof (string)); 
     table1.Rows.Add("SN123"); 
     table1.Rows.Add("SN456"); 
     table1.Rows.Add("SN789"); 
     var table2 = ds.Tables.Add("Table2"); 
     table2.Columns.Add("Expression", typeof (string)); 
     table2.Rows.Add("SN000"); 
     table2.Rows.Add("SN456"); 
     table2.Rows.Add("SN999"); 

     var table1Rows = table1.AsEnumerable(); 
     var table2Rows = table2.AsEnumerable(); 

     var matches = table1Rows.Join(table2Rows, l => l["Expression"], r => r["Expression"], (l, r) => l["Expression"]); 
     foreach (var match in matches) 
     { 
      Console.WriteLine(match); 
     } 
+0

我不認爲這會工作,因爲我用Access數據庫中的數據填充數據集 – Stick

+0

此代碼不取決於Access。你從Access中填充你的數據集,但是連接發生在代碼中。 –

0

您是否試圖獲得兩張表中的所有SN?如果是的話,你應該嘗試像這樣的子查詢。

"SELECT b.RSV_CAT, b.SEQNUM, b.LEASE, 
    b.WELL_ID, a.QUALIFIER, a.KEYWORD, a.EXPRESSION 
    FROM [AC_ECONOMIC] a INNER JOIN [AC_PROPERTY] b 
    on a.PROPNUM=b.PROPNUM WHERE a.KEYWORD = '" +end+ "' 
    AND a.QUALIFIER = '" +qual+ "' AND a.EXPRESSION IN 
    (SELECT a.EXPRESSION FROM [AC_ECONOMIC] a INNER JOIN [AC_PROPERTY] b on 
    a.PROPNUM=b.PROPNUM WHERE a.KEYWORD = '" + start + "' AND a.QUALIFIER = '" + qual 
    + "' AND a.EXPRESSION LIKE 'SN%'", con3); 

這應該給你那些匹配。這段代碼會給你所有的SN都是兩個不同關鍵字的表。

+0

SN在同一張桌子上,他們只是有不同的關鍵字,如結束和開始 – Stick

+0

我不認爲相關的子查詢將工作,因爲源表存在於不同的數據庫。我不是一個Access人,所以也許有一個「鏈接表」的方式,我只是不明白。 –

+0

是的,這沒有爲我工作,它給了我,「你已經寫了一個子查詢,可以返回多個字段,而不使用主查詢的FROM子句中的EXISTS保留字修改子查詢的SELECT語句只請求一個字段。 – Stick

相關問題