2010-01-26 2 views
1

C# 및 Visual Studio 2005에서 작업하고 있습니다. 마법사에서 만든 형식화 된 데이터 집합이 있습니다. MyGeneratedDataSet.tblFoo.Select()를 실행하고 각 테이블에서 데이터를 가져올 수 있지만 메모리 데이터베이스가 거의 없거나 또는해야 할 일과 같은 모든 쿼리를 수행 할 수있는 방법이 있는지 확인합니다. 테이블에 의해 단편적인 테이블?조인과 함께 전체 데이터 세트를 한 번에 쿼리합니까?

감사합니다. Joshua

+0

데이터 세트에 DataRelations가 포함되어 있습니까 –

답변

2

전체 데이터베이스를 데이터 세트로 가져 오시겠습니까? 이는 여러 가지 이유로 나쁜 생각이지만 데이터베이스가 커질수록 (즉 핵심) 앱의 리소스 사용량이 늘어나고 애플리케이션이 서서히 중단되기 때문입니다.

데이터베이스에 두 개의 테이블 (ok, 어쩌면 3 개) 만 있으면 않는 한, 왜 그렇게하고 싶은지 상상할 수 없습니다. 사용자가 해당 부분을 요구할 때 필요한 부분만을 소비하도록 응용 프로그램을 설계해야합니다.

좋은 오래 된 종이와 연필로 일부 창을 스케치하고 사용자가 볼 수있는 것을 조롱 해보십시오. 나는 당신이 당신의 손에있는 모든 데이터를 원하지 않는다는 것을 알게 될 것이라고 생각한다. 그것은 단지 사용자가 현재하고있는 행동과 관련이있다.

+0

여러 개의 테이블이 있지만이 경우 연결된 XML 파일 하나가 여러 테이블에 걸쳐 포함되어있어 사용하려는 테이블이 여러 개 있습니다. db에서 레코드를로드하기위한 코드를 데이터 집합에서로드 한 다음 사용자가 비교할 수 있도록합니다. – Joshua

+0

내 견해는 여전히 모든 것을로드하는 것이 아니라로드해야한다는 것을로드하는 것이 가장 좋습니다. 여전히이 작업을 수행하려는 경우 http://stackoverflow.com/questions/2037522/how-to-load-sql-server-db-into-dataset에서 비슷한 질문을 확인할 수 있습니다. –

0

는 데이터 집합은 두 개의 테이블을 가지고 말 (A, B)
데이터베이스는 (A는, B)
그들은 DB 및 데이터 집합 beween 이름이 다를 수 있지만, 다음 매핑

을 만들 필요가 같은 테이블이

실제로 매우 쉽습니다.
(SQL 서버에 대한 예, pseudoish 코드)

string fQuery = "SELECT * FROM A;SELECT * FROM B:"; 
SqlCommand fCommand = new SqlCommand(fQuery, <connection>); 
SqlDataAdapter fAdpter = new SqlDataAdapter(fCommand); 
DataSet fSet = new DataSet(); 
fAdpter .Fill(pSet); 

지금 전체 세트는 하나 개의 쿼리에 가득합니다.
실제로 성능이 우수 할 수 있습니다.

0

(VB 답변,하지만 당신은 변환 할 수 있어야한다)

가 전체 데이터 세트를로드하는 하나의 쿼리를 사용하려면 ...

  1. 멀티 결과 쿼리를 만듭니다.
  2. 데이터 집합의 테이블 어댑터 중 하나에 대한 쿼리를 만듭니다 (입력 된 매개 변수를 활용하는 등).
  3. 생성 된 코드의 복사본으로 쿼리를 오버로드합니다.
  4. 마지막 fill (datatable) 문을 fill (dataset) 문으로 바꿉니다.
  5. 형식화 된 테이블을 수정하기 위해 테이블을 매핑하는 코드를 실행하십시오.

1) 결과를 반환하는 SELECT 문이 여러 개인 저장 프로 시저 또는 SQL 문을 작성하십시오.

2) 데이터 집합의 테이블 어댑터 중 하나에서 새 쿼리를 추가하십시오.

3)이 쿼리에 대해 생성 된 코드를 가져옵니다. 가장 쉬운 방법은 코드에서 쿼리의 메서드를 사용하고 메서드를 마우스 오른쪽 단추로 클릭 한 다음 "정의로 이동"을 선택하는 것입니다. 그 방법을 별도의 cs 또는 vb 파일에 저장하십시오.(코드 블록 B 참조)

메서드가 작동하려면 네임 스페이스 및 tableadapter 부분 클래스를 가져와야합니다.

4) 오버로드 된 함수에 매개 변수로 데이터 집합을 추가합니다. 이 데이터 세트는 새로운 채우기 문장의 대상이됩니다. (코드 블록 B 참조)

5) 데이터 세트 결과 테이블을 일치 시키려면 다음 코드를 사용하십시오.

Public Shared Sub DatasetAutoMerge(ByVal Source As Data.DataSet, ByVal Target As Data.DataSet) 
    Target.EnforceConstraints = False 

    For Each dtTarget As Data.DataTable In Target.Tables 
     For Each dtSource As Data.DataTable In Source.Tables 
      Dim dtMatch = dtSource 
      For Each dcTarget As Data.DataColumn In dtTarget.Columns 
       If Not dtSource.Columns.Contains(dcTarget.ColumnName) Then 
        'The source does not have a column we need by name, not a match' 
        dtMatch = Nothing 
        Exit For 
       End If 
      Next 

      If dtMatch IsNot Nothing Then 
       dtTarget.Merge(dtMatch, False, Data.MissingSchemaAction.Ignore) 
       Exit For 
      End If 
     Next 
    Next 

    Target.EnforceConstraints = True 
End Sub 

코드 블록 B (재정의 방법의 최종 버전의 샘플, VB)

Namespace dsMyDatasetTableAdapters 
    Partial Public Class Table1TableAdapter 
     Public Overridable Overloads Function Fill(ByVal dataset As dsMyDataset, ByVal OrderNumber As String) As Integer 
      Me.Adapter.SelectCommand = Me.CommandCollection(0) 
      If (RecordID Is Nothing) Then 
       Me.Adapter.SelectCommand.Parameters(0).Value = Global.System.DBNull.Value 
      Else 
       Me.Adapter.SelectCommand.Parameters(0).Value = CType(OrderNumber, String) 
      End If 

      'end autogenerated code' 

      'Start Custom Code' 
      Dim dsDump As New Data.DataSet 

      Me.Adapter.Fill(dsDump) 

      DatasetAutoMerge(dsDump, dataset) 
     End Function 

    End Class 
End Namespace 

나는이 과정을 몇 번 사용했습니다. 이 모든 것을 동시에로드하려면 별도의 쿼리를 작성하는 것보다 훨씬 낫습니다. 이게 너를 돕기를 바란다.