2009-02-26 3 views
3

C# 및 SQL Server 2005를 사용하며 개체를 채우는 방법에 대한 권장 사항이 필요합니다.C# multiple connections vs Dataset

고객 컬렉션이있는 고객 컬렉션이 있습니다. 각 고객 오브젝트에는 주문 모음이 들어있는 Orders 콜렉션이 들어 있습니다.

고객 컬렉션에서 공용 Fetch() 메소드를 사용하여 고객 및 주문을 채 웁니다.

연결 당 하나의 DataReader 만 열 수 있습니다. 그래서 'SELECT * Customers'독자를 위해 하나의 연결이 필요하다는 것을 의미 할 것이고, 고객 판독기를 반복하면서 각각의 SELECT * OrderId CustomerId_fk = @Id에 대해 다른 연결이 필요할 것입니다.

내 질문 : 위의 방법을 사용 하시겠습니까? 아니면 단순한 DataSets를 사용 하시겠습니까?

편집

I 있었다 대신 '* 고객 SELECT' '아이디 = @Id가 * 고객 SELECT'.

답변

3

실제로, 귀하의 주장 ("연결 당 하나의 DataReader 만 열 수 있음")은 올바르지 않습니다. 당신은 enable MARS (Multiple Active Result Sets)을 사용하여 연결 문자열을 조정할 수 있습니다. 물론 당신은 여전히 ​​왕복 (n + 1)을 많이 가질 것입니다.

나는 또한 즉각적인 대안이 데이터 집합이라고 생각하지 않습니다. 개인적으로, 나는 두 개의 결과 그리드 (하나의 쿼리 또는 두 개의 쿼리에서)를 사용하고 함께 호출자에게 스티치합니다.

또는 LoadWith<Customer>(c=>c.Orders); (DataLoadOptions)의 LINQ-SQL과 같은 것을 사용하십시오. LoadWith이 없어도 Customer에 대한 컬렉션을로드하면 자동으로 동일한 n + 1 동작을 수행합니다 (탐색 속성은 기본적으로 느리게로드됩니다).

2

아마도 나는 SqlDataAdapter를 사용하여 DataSet에 대한 한 번에 모두 쿼리 할 수 ​​있습니다. 이런 식으로 뭔가 : 다음

SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM CUSTOMERS WHERE CustomerId = @id; SELECT * FROM ORDERS WHERE CustomerId = @id",connection); 
adapter.Fill(dataSet); 

, 나는 이런 식으로 뭔가를 사용하여 관계를 설정했던 :

dataSet.Relations.Add(new DataRelation("relationName", dataSet.Tables[0].Columns["CustomerId"], dataSet.Tables[1].Columns["CustomerId"]); 

이 방법, 당신은 단지 당신이 모든 데이터를 조회, 하나의 연결을 열고 한 다음 설정 기억에있는 관계를.

0

젠장! 나는 단지 내 손을 물고 두 개의 연결을 사용했습니다.

'em과 datareader를 닫아야한다는 것을 기억하십시오.

나는 왜, 나는 단지 DataSet을 어디에서든지 사용할 수 없다!

1

Marcs 응답을 확장 해 보겠습니다. DataReader는 동시에 여러 결과 집합을 읽을 수 있습니다. 따라서 다음 작업을 수행 할 수 있습니다.

물론 필요한 데이터 만 가져 오지만 그 점은 알 수 있습니다. 이렇게하면 하나의 명령을 사용하여 두 결과 세트를 모두 가져올 수 있습니다.

+0

여기에는 내 포인트 중 하나가 포함됩니다 (하나의 명령에서 여러 개의 격자). MARS 지점은 별개의 문제입니다 .-p –

+0

MARS는 정말 유용 할 수 있지만 여기서는 필요하지 않다고 생각합니다. –