2011-04-21 3 views
5

SqlDataAdapter 및 DataSet을 사용하여 MSSQL 서버에서 데이터를 검색하고 있습니다. 해당 DataSet에서 DataTable을 생성합니다. 내 목표는 요소의 쉼표로 구분 된 문자열로 테이블의 각 열을 변환하는 것입니다. 분리 문자 작업을하기 전에 먼저 문자열 변환을 시도 할 것이라고 생각했습니다.DataTable 열의 전체 내용을 C#으로 구분 된 문자열로 변환하는 방법은 무엇입니까?

코드는 ASP.Net 페이지의 코드 숨김에서 실행됩니다. 궁극적 인 목표는 문자열을 jscript 변수에 전달하는 것입니다. 함수 요구 사항이므로 열에서 구분 된 문자열을 만들고 jscript 변수로 끝나야합니다. LOOP1 것들에

DataSet myDataSet = new DataSet(); 
    mySqlDataAdapter.Fill(myDataSet); 
    DataTable temperature = myDataSet.Tables["Table"]; 

    // LOOP1 
    foreach (DataRow row in temperature.Rows) 
    // this loop works fine and outputs all elements 
    // of the table to the web page, this is just to 
    // test things out 
    { 
     foreach (DataColumn col in temperature.Columns) 
     { 
      Response.Write(row[col] + " ### "); 
     } 
     Response.Write("<br>"); 
    } 

    // LOOP2 
    foreach (DataColumn column in temperature.Columns) 
    // this loop was meant to take all elements for each 
    // column and create a string, then output that string 
    { 
     Response.Write(column.ToString() + "<br>"); 
    } 

잘 작동 :

는 여기에 내가 지금까지 무슨이다. 내 데이터에는 4 개의 열이 있으며, 모두 웹 페이지의 행당 하나의 레코드로 적절하게 렌더링됩니다.

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.tostring.aspx에서 LOOP2 코드를 보았습니다. 실제로는 내가 원하는 것을하지 않는다는 것 외에는 필요한 것을 정확하게 수행하는 것으로 보입니다.

LOOP2가하는 유일한 일은 웹 페이지에 4 줄을 쓰는 것입니다. 각 행에는 해당 테이블 열의 머리글이 있지만 추가 데이터는 없습니다. 분명히 내 부분에 논리 결함이 있거나 DataColumn 및 .toString을 사용하여 작동하는 방식을 오해하고 있습니다. 이걸 좀 도와주세요. 미리 감사드립니다.

편집 : 내가 결국 원하는 것은 네 개의 문자열이 Table quesry result @ ImageShack

여기로부터 생성 될 문자열에 대한 예입니다 : 여기에 SQL 쿼리 결과의 예는,이 표는 모습입니다입니다 두 번째 열 : "-6.7, -7, -7.2, -7.3, -7.3". 재산 이 설정되어있는 경우

+0

페이지에 표시되는 데이터, 즉 레코드 당 하나의 문자열을 원하십니까? –

+0

현재 예, 열마다 하나의 문자열, 즉 열의 모든 레코드가 단일 문자열로 변환됨을 의미합니다. 이 모든 이유는 response.write()보다 jscript 변수에 문자열을 전달하기 때문입니다. –

답변

8

이 코드 ", " 각 열에서 셀의 값을 연결한다 : 예를 들어

foreach (var column in temperature.Columns) 
{ 
    DataColumn dc = column as DataColumn; 
    string s = string.Join(", ", temperature.Rows.OfType<DataRow>() 
               .Select(r => r[dc])); 
    // do whatever you need with s now 
} 

, DataTable에 대한 정의 :

DataTable table = new DataTable(); 
table.Columns.Add(new DataColumn("Column #1")); 
table.Columns.Add(new DataColumn("Column #2")); 
table.Rows.Add(1, 2); 
table.Rows.Add(11, 22); 
table.Rows.Add(111, 222); 

.. "1, 11, 111""2, 22, 222" 문자열을 생성합니다.


편집 : DataColumn에 반대로 당신이 VAR로 컬럼을 선언하기로 결정했다는, 개인적인 취향/스타일이나의 문제가 코딩에 문제가 있다는 것입니다?우리가 지금 열 값 목록의 목록을 가지고 우리는 가정

// we decide we'll use results later, storing them temporarily here 
List<IEnumerable<string>> columnsValues = new List<IEnumerable<string>>(); 
foreach (DataColumn column in temperature.Columns) 
{ 
    var values = temperature.Rows.OfType<DataRow>() 
           .Select(r => r[column].ToString()) 
    columnsValues.Add(values); 
} 

:

은 (위와 같은 데이터 테이블의 예에) 시나리오를 다음 고려합니다. 그래서, 우리는 다음과 같이, 그것들을 인쇄 할 때 :

foreach (var lisOfValues in columnsValues) 
{ 
    foreach (var value in listOfValues) 
    { 
     Debug.Write(value + " "); 
    } 

    Debug.WriteLine(""); 
} 

우리는 2 22 222 다음 1 11 111를 볼 것으로 예상. 권리?

틀린.

이 코드는 2 22 222을 두 번 출력합니다. 왜? 우리 .Select(r => r[column].ToString())캡처column 변수 -하지의 가치,하지만 변수 자체 - 우리는 우리가 루프에서있어 일단 우리가 알고있는 모든 column마지막 값이 즉시 사용하지 마십시오입니다. this 같은 게시물에서, 예를 들어 -

폐쇄캡처 변수이 개념 검색에 대한 자세한 내용은.

요약 :

바로이 경우에 당신은 foreach 성명에서 DataColumn으로 갈 수 있습니다. 여기에서 중요하지 않습니다. 왜냐하면 우리가 .Select(r => r[dc])을 루프 (정확하게는 string.Join)로 열거하고 다음 반복에 도달하기 전에 결과를 산출하기 때문입니다. 캡처 한 내용이 즉시 사용됩니다.

+0

빠른 응답에 감사드립니다. VS2010이 "OfType"을 좋아하지 않는 이유를 정확히 알지 못했습니다. 오류 'System.Data.DataRowCollection'에 'OfType'에 대한 정의가 없습니다. '및'System.Data.DataRowCollection '형식의 첫 번째 인수를 받아들이는 확장 메서드'OfType '이 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) .Net 4에서 OfType이있는 것 같습니다. 2.0 이전? –

+0

파일에 System.Linq 네임 스페이스가 없습니다. 단순히'using System.Linq;'를 추가하십시오. –

+0

Brilliant! 참으로 대단히 감사합니다. 슬프게도 아직 투표 할 수 없습니다. –

0

당신이 명확하게 게시 한 링크는,

익스프레션 값을 말한다; 그렇지 않은 경우 ColumnName 속성

그런 현상이 발생합니다. 열 이름을 가져옵니다.

+0

좋은 캐치 Amit, 고마워! –

0
+0

답장을 보내 주셔서 감사합니다. 기존의 행과 열을 반복하고 반환 작업에서 문자열을 어셈블하는 기본 방식 인 LOOP1은 기본적으로 문자열을 작성하지 않는다는 점을 제외하고는 기본적으로 수행합니다. DataColumn 속성을 이해하고 올바르게 사용하는 방법을 알고 있습니다. –