2013-07-24 2 views
0

사용자가 다양한 데이터 원본을 예측할 수없는 열 스키마와 매핑하는 옵션이있는 프로그램이 있습니다. 그래서 그들은 10 개의 필드를 가진 SQL Server 데이터베이스를 가질 수도 있고 20 개의 파일을 엑셀 할 수도 있습니다 - 이름은 무엇이든 될 수 있고 필드의 데이터 유형은 텍스트와 숫자, 날짜 등이 혼합 될 수 있습니다..NET DataTable의 내용을 다른 스키마가있는 다른 DataTable로 변환

각 필드가 의미하는 것의 맵핑을 제공합니다. 따라서 열 4는 "LocName"이고 열 2는 "LocX"이고 열 1은 "LocDate"입니다. 사용자가 매핑 할 옵션으로 제공되는 이름과 데이터 형식은 DataSet DataTable (XSD xchema 파일). 예를 들어

, 소스는 다음과 같은 형식의 데이터가 포함되어있는 경우 :

User Column 1: "LocationDate" of type string 
User Column 2: "XCoord" of type string 
User Column 3: "YCoord" of type string 
User Column 4: "LocationName" of type int 

을 사용자는 그 DataTable에 필요한 응용 프로그램이로 변환 필요 매핑을 제공합니다

Application Column "LocName" of type string = Column **4** of user table 
Application Column "LocX" of type double  = Column **2** of user table 
Application Column "LocY" of type double  = Column **3** of user table 
Application Column "LocDate" of type datetime = Column **1** of user table 

나는 원본에 연결하고 "원시"형식의 사용자 쿼리에 대한 데이터를 DataTable로 가져 오는 루틴을 가지고 있으므로 소스의 스키마를 사용합니다.

내 질문은 원시 데이터 테이블의 데이터를 필요한 응용 프로그램 데이터 테이블로 변환하는 가장 좋은 방법은 무엇입니까?이 투영법은 유형 변환을 고려해야합니다.

foreach는 분명히 작동 할 것입니다. 그러나 그것은 각 행의 모든 ​​루프에있는 데이터 유형을 고려해야하기 때문에 무차별 한 것처럼 보입니다. LINQ 또는 ADO.NET을 사용하여 "매끄러운"방법을 사용하고 있습니까?

답변

0

나는 보통 대상 테이블처럼 보이지만 소스 테이블의 데이터를 사용하여 선택합니다. 필요에 따라 데이터 변환을 적용 할 수도 있습니다.

Select 
    Cast (LocationNameLocationName As varChar(...) As LocName 
, LocX As XCoord 
, ... 
From SourceTable 

간단한 대답으로 설명하기가 어렵습니다. 내가 과거에 한 일은 "Select * From sourcetable Where 1 = 0"과 같이 "행"을 반환하지 않고 모든 열과 그 유형을 결과 집합에서 사용할 수있게하는 "빈"쿼리를 발행하는 것입니다. 열의 ADO 객체를 순환하여 각각의 유형을 얻을 수 있습니다. 그런 정보를 사용하여 실제 SQL 문을 동적으로 빌드 할 수 있습니다.

변환을 결정하는 논리는 여전히 많이 있지만, 테이블을 읽을 때가 아니라 명세서를 작성할 때 모두 발생합니다. 여전히 코드에서 "소스 열이 정수이고 대상 열이 문자이면 select (Varchar로)"로 변환하려고합니다. "

선택하면 행을 얻기 위해 ADO에서 실행할 수있는 선택 항목이 있으며 실제 이동은 원할 때 필드가 들어오는 것처럼 읽기/쓰기처럼 단순 해집니다. 당신은 또한 "Select into Select ..."를 위해 그것을 사용할 수 있습니다.

희망적입니다. 설명하는 것보다 개념이 더 쉽습니다.

+0

게시물 주셔서 감사합니다. 어떻게하면 소스의 DataType이 런타임에 어떤 것도 될 수 있다는 사실을 어떻게 다룰 것입니까? – Ernie

+0

원래 답변을 수정하십시오. – asantaballa

+0

다시 한번 감사드립니다. 좋아, 내가 생각한 것. 나는 LINQ 나 내가 생각하지 못했던 다른 것에서 어떤 종류의 "마법"을 기대했지만 더 소원한 생각이었다고 생각한다. :) – Ernie

관련 문제