2012-03-28 1 views
3

연구 중에 .NET 단위를 사용하고 있습니다. 저는 방금 막 시작했습니다. 강사와 함께 .NET에서 가장 견고한 기초를 제공하지 못했기 때문에, noobishness를 변명하십시오.C#에서 Access '07 데이터베이스에 대한 쿼리 문제

나는 아주 간단하고 일반적인 데이터베이스 기반 응용 프로그램을 만들고 있습니다. C#을 사용하고 있으며 Microsoft Access 2007 데이터베이스에 액세스하고 있습니다.

저는 커밋에 사용하는 OleDbDataAdapters를 뱉어내는 메서드로 자체 클래스에 database-ish를 넣었습니다. 쿼리를 수행하는 모든 메서드를 제공합니다.이 메서드는 주 프로그램에서 DataSet 개체를 가져옵니다.이 메서드는 데이터를 보관합니다 (db의 여러 테이블).

SQL SELECT 쿼리를 수행하는 데 사용하는 매우 일반적인 개인 메서드를 만들고이 메서드를 래핑하여 제품을 가져 오는 public 메서드를 orders.etc (일반 소매점 데이터베이스)했습니다.

일반적인 방법은 실제로 연결하기 위해 별도의 연결 방식을 사용하며, 다음과 같은 것이있다 :

private static OleDbDataAdapter GenericSelectQuery(
    DataSet ds, string namedTable, String selectString) 
{ 
    OleDbCommand oleCommand = new OleDbCommand(); 
    OleDbConnection conn = Connect(); 
    oleCommand.CommandText = selectString; 
    oleCommand.Connection = conn; 
    oleCommand.CommandType = CommandType.Text; 

    OleDbDataAdapter adapter = new OleDbDataAdapter(); 
    adapter.SelectCommand = oleCommand; 
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
    adapter.Fill(ds, namedTable); 

    return adapter; 
} 

랩퍼 방법 그냥 통과 다음과 같이

private static OleDbConnection Connect() 
{ 
    OleDbConnection conn = new OleDbConnection(
     @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Temp\db.accdb"); 
    return conn; 
} 

일반적인 방법은 주 프로그램에서받은 DataSet을 따라 명명 된 문자열은 데이터 집합의 테이블 이름이고 사용자가 원하는 쿼리를 전달합니다.

어떤 쿼리를 제공해도 상관 없습니다 (SELECT * FROM TableName과 같은 단순한 것조차도) 나는 여전히 OleDbException을 던져서 쿼리의 FROM 절에 오류가 있음을 알립니다. 방금 Access를 사용하여 쿼리를 작성했지만 아직 사용법은 없습니다. 분명히 내 코드에는 문제가있어 실제로 놀라지 않을 것입니다.

다음은 내가 사용하는 래퍼 메소드입니다.

public static OleDbDataAdapter GetOrderLines(DataSet ds) 
{ 
    OleDbDataAdapter adapter = GenericSelectQuery(
     ds, "orderlines", "SELECT OrderLine.* FROM OrderLine;"); 
    return adapter; 
} 

그들은 모두 동일하게 보입니다. 변경되는 SQL 일뿐입니다.

+1

일반적으로 폐쇄를 보장하기 위해 연결을'using' 블록에 넣습니다. 너는 그들을 전혀 닫지 않는 것 같니?!? –

+4

빠른 생각 하나 ... Access에서 db에 대해 동일한 쿼리를 실행 해 보았습니까? – TGH

+2

@UweKeim 저는 C#에서'using '에 대해서조차 몰랐습니다. 이것이 제가 말하는 적절한 기반의 부족입니다. 이 문제에 관해서는 테이블 이름 주위에 대괄호를 넣는 것만으로도 모든 것이 수정됨을 알 수 있습니다. 모든 것이 Access 내부에서 잘 작동하므로 잘 모르겠습니다. 내가 실제로 할 수있을 때 나는 공식적으로 질문에 대답 할 것이다. 내 평판이 주어진다면 나는 6 시간 더 할 수 없다. –

답변

0

대괄호로 문제가 해결 된 것 같습니다. 나는 키워드를 사용하고있다. 흠.

0

찾고 계신 테이블에 연결되어 있다면 더 간단한 것을 시도해 보셨습니까? 그런 다음

DataSet ds = new DataSet(); 
    using (OleDbConnection myConnection = new OleDbConnection 
     (@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Temp\db.accdb")) 
      { 
      myConnection.Open(); 
      OleDbDataAdapter myAdapter = new OleDbDataAdapter("SELECT OrderLine.* FROM OrderLine;, myConnection); 
      myAdapter.TableMappings.Add("Table", "TestTable"); 
      myAdapter.Fill(ds);    
      }      

같은 무언가가 거기에서 물건을 당신이 DB를 타격하고 결과를 얻는 경우이 사실을 보여줍니다

ds.Tables[0].Rows.Count() 

와 DS에 있는지 확인하십시오. 여기에서 더 우아하게 만들 수 있습니다.

관련 문제