2013-07-24 4 views
0

Access 데이터베이스에서 두 테이블을 읽는 두 개의 데이터 집합이 있습니다. 나는 EXPRESSION에 의해 ​​데이터를 일치 시켜서 모든 일치하는 "SN 's"을 유지하고 일치하지 않는 것들을 제거 할 수 있기를 원합니다. 지금까지 제 코드는 모든 "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 조인을 사용할 수 있습니까? –

+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에서 데이터 집합을 채우지 만 조인은 코드에서 발생합니다. –

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 녀석이 아니기 때문에, 아마 내가 이해하지 못하는 "Linked Table"방법이있을 것입니다. –

+0

그래, 나에게 준이 일은 "메인 쿼리의 FROM 절에 EXISTS 예약어를 사용하지 않고 둘 이상의 필드를 반환 할 수있는 하위 쿼리를 작성했습니다. 하위 쿼리의 SELECT 문을 수정하여 하나의 필드 만 요청합니다. – Stick

관련 문제