2011-01-18 2 views
0

나는 약 5 테이블을 반환하는 저장 프로 시저를하고 난 이런 식으로 그들에게 뭔가를 반환하고 있습니다 :저장 프로 시저에서 테이블 이름을 인식하도록 DataSet을 가져 오는 방법은 무엇입니까?

select <fields> from Products where ProductId = @ProductId 
select <fields> from RelatedProducts where ProductId = @ProductId 
select <fields> from MetaData where ProductId = @ProductId 

잘, 당신은 요점을 얻을. 이제 데이터 집합에, 내가 할 경우이 :

DataSet ProductDs = DAL.RetreiveProductMetadata(someInteger); 

ProductName = DataSet.Tables["Products"].Rows[0]["columnName"].ToString(); 

그 예외를 던지고 ... 음, TABLENAME가 null 및 디버깅에있다라고 오류가 밝혀, 테이블 이름은 실제로 "Results1"로 명명되어, "Results2"등등.

select * From products AS Products 

효과 없음 :

나는에 저장된 프로 시저를 변경했습니다.

어떻게 C#에서 데이터베이스의 테이블 이름을 찾아서 사용할 수 있습니까?

ps : 모든 종류의 Coalesces 및 사례가 현장에서 있습니다. 문제가있는 것이 아닙니다.
또한 인터넷 검색을 시도해 보았습니다.

+0

int를 사용하여 테이블을 인덱싱하려고하면 어떻게됩니까? – dandan78

+0

물론 작동 할 것입니다. 그러나 이름으로 액세스하려고하는 요점은 읽기 쉽도록하기위한 것이므로 나중에 테이블 [0]과 [1] (또는 다른 어떤 코더가 작동하는 다른 코더)와 혼동하지 마십시오. 나중에 내 코드에) – iamserious

+0

또 다른 바보 같은 질문 : 당신은 소문자로 테이블 이름을 입력하려고 했습니까? 나는 과거에도 비슷한 문제가 있었음을 기억합니다.하지만 어떻게 해결했는지는 확실하지 않습니다. 대소 문자 구분에 대해 생각해 보았습니다. – dandan78

답변

2

수 없습니다. 쿼리에는 많은 테이블이 포함될 수 있으므로 결과 집합에는 테이블 이름이 의미가 없습니다.

을 알고 있어야하며 결과 집합이 테이블 이름을 파생시키는 데 필요하므로 꼭 사용해야 할 필요는 없습니다.

그렇지 않으면,

select 'Products' AS ThisTable, <fields> from Products where ProductId = @ProductId 

또는 최초 가입 이후

을 뽑아 풀다 또는 따라 dataset.xsd 등 정면 및지도를 정의합니다.

+0

예 결과 세트가 어떻게 될지 압니다.하지만이를 위해 노력하고 있습니다. 다음 사람은 내 코드를 더 쉽게 볼 수 있습니다. 오, 음, 그게 내게 여분의 일을 제공한다면, 더 생산적이고 움직여 라 !! 감사! – iamserious

+0

@iamserious : 리포지토리 또는 DAL 인 경우 데이터 테이블을 더 높은 수준의 코드로 숨길 수 있습니다. 우리는 procs에서 여러 결과 집합을 사용하지만 당신이 문제로보고 문제를 결코 고려하지 ... – gbn

+0

당신은 그걸 확장 할 수 있습니까? 내 DAL에서 몇 가지 강력하게 형식화 된 데이터 집합 및 저장 프로 시저를 실행하고 결과를 반환하는 클래스 파일을 가질 수 있도록 정말 모든 테이블 어댑터에 적합하지 않는 저장된 procs 있습니다. 코드를 통해 어떻게 액세스합니까? – iamserious

1

데이터 집합에서 이름으로 테이블을 검색 할 수있는 유일한 방법은 다음과 같습니다 당신이 그것을 이름을 경우 어댑터에서 충전하거나 수동으로 한 번에 나중에 하나 개의 테이블을 이름을 지정할 때 : 당신은에 액세스 할 때 지금

adapter.fill(dataset, "nameoftable") 

미래에는 이름으로 액세스 할 수 있습니다. ds.tables("nameoftable").rows

또는 나중에 이름을 지정하십시오.

adapter.FillSchema(dataset, SchemaType.Source); 
adapter.Fill(dataset); 

이 쿼리에서 작동하지 않는 것 같습니다 :

_ds.tables(0).tablename = "nameoftable" 
3

은 실제로 가능, 당신은 단지 테이블 이름을 포함하는 테이블 구조에 대한 데이터 만 정보를 포함하지 않는, 먼저 테이블 구조를로드 할 필요 (MS Access에서 사용하는 것처럼) 데이터베이스에 포함되어 있지만 일반 테이블 작업을 수행합니다.

관련 문제