2011. 11. 20. 17:50

1/4. 한 프로젝트에서 웹서비스 만들기
2/4. DB연결 하기
3/4. 리스트 주고 받고 - 서버 탐색기와 린큐를 이용한 방법
4/4. 리스트 주고 받고 - 클래스를 이용한 방법

클래스방식으로 가저오면 데이터를 필요한것만 보낼수 있습니다.
문제는 이방법을 사용하려면 변환작업을 해야 한다는 단점이 있죠.

DB는 린큐때와 다르게 일반적인 방법을 사용하여야 합니다.
2/4에서 연결한 방법을 사용합니다.
2/4의 내용을 숙지했다고 생각하고 포스트를 씁니다.

0.저장 프로시저 만들기
저장프로시저의 이름은 ListGet로 하고 아래와 같이 만들어 줍니다.

Select Top 10 strData1, strData2, strData3
From tb_WebServiceTest

1.넘겨줄 클래스 생성
클래스는 WFC가있는 웹서비스에 생성하시면 됩니다.


당연한 이야기겠지만 이 클래스는 퍼블릭으로 선언하셔야 합니다.

내용은 전달할 데이터를 만듭니다.

public class claData
{
    /// <SUMMARY>
    /// 데이터A
    /// </SUMMARY>
    public string strA { get; set; }
    /// <SUMMARY>
    /// 데이터B
    /// </SUMMARY>
    public string strB { get; set; }
    /// <SUMMARY>
    /// 데이터C
    /// </SUMMARY>
    public string strC { get; set; }
}

2.웹 서비스에 함수
일단 클래스로 데이터를 넘기기 위해선 먼저 아답터를 이용해서 데이터를 가저와야 합니다.
(리더로도 가능은 합니다만...)

웹서비스에 노출되도록 인터페이스를 만듭니다.

[OperationContract]
List<CLADATA> GetClass();



먼저 아답터를 선언합니다.
그래야 데이터를 바인딩 할테니까요 ㅎㅎ

SqlConnection msConn = null;		// DB서버 연결을 위한 객체
SqlCommand msComm = null;		    // Command 객체
SqlDataAdapter msAdapter = null;	// 데이터 아답터 객체


그다음 메소드를 만듭니다.

public List<CLADATA> GetClass()
{
    //리턴할 데이터 리스트
List<CLADATA> insRetun= new List<CLADATA>();
            
    //데이터 임시저장용
    claData insData;

    //전체데이터를 받아올 데이터테이블
    DataTable dtData = new DataTable();

    //데이터요청 프로시저
    msComm = new SqlCommand("GetData_Range", msConn);
    msComm.CommandType = CommandType.StoredProcedure;

    //아답터 생성
    msAdapter = new SqlDataAdapter(msComm);

    //데이터 테이블 체우기
    msAdapter.Fill(dtData);

    //받아온 데이터테이블을 필요한 데이터를 추출하여 클래스로 만든다.
    foreach (DataRow drTemp in dtData.Rows)
    {
        insData = new claData();
        insData.strA = drTemp["strData1"].ToString();
        insData.strB = drTemp["strData2"].ToString();
        insData.strC = drTemp["strData3"].ToString();

        //리턴할 데이터에 추가
        insRetun.Add(insData);
    }

    return insRetun;            
}


3.이벤트 걸기
이벤트를 걸기전에 웹서비스 업데이트는 필수 입니다 ㅡ.-;;


이거 안하면 안나옵니다 ㅎㅎ


//클래스를 이용한 리스트 겟
sc.GetClassCompleted += new EventHandler<ServiceReference1.GetClassCompletedEventArgs>(sc_GetClassCompleted);



이렇게 이벤트 내용을 넣습니다.
만약 .ToList()가 나오지 않는다면 'System.Linq'를 유징 하시면 됩니다.
(using System.Linq;)

void sc_GetClassCompleted(object sender, ServiceReference1.GetClassCompletedEventArgs e)
{
    //리스트 겟 - Class
    dgDB.ItemsSource = (List<ServiceReference1.claData>)e.Result.ToList();
}



이제 해당 웹서비스를 호출하면 리스트가 넘어 옵니다.

private void butGet_Class_Click(object sender, System.Windows.RoutedEventArgs e)
{
	//리스트 클래스로 받기
	sc.GetClassAsync();
}

4.데스트 해보기
아래 샘플에 직접 테스트 해 봅시다.