2013-06-18 2 views
0

WCF에서 listbox를 채우는 방법에 대해 많은 어려움을 겪고 있습니다.WCF에서 목록 상자 채우기

lstProcesses.BeginUpdate(); 
     lstProcesses.Items.Clear(); 
     while (dr.Read()) 
     { 
      lstProcesses.Items.Add(dr.GetString(0)); 
     } 
     dr.Close(); 
     con.Close(); 
     lstProcesses.EndUpdate();*/ 

내 새로운 코드가 있었다 시도 : 이것은 내 예전의 코드 내가 내 WCF를 구현하기 위해 노력하기 전에 사용되는

public void ShowData2() 
    { 

     try 
     { 

      ServiceReference6.Service1Client obj6 = new ServiceReference6.Service1Client(); 
      if (obj6.SelectSavedProcessInformation()) 
      { 

       string passed = ""; 

      lstProcesses.Items.Add(obj6); 

      } 
      else 
      { 

       string failed = ""; 

      } 
     } 
     catch 
     { 


     } 
    } 

내 WCF이 구성

public bool SelectSavedProcessInformation() 
    { 
     SqlConnection con = new SqlConnection(@"Data Source=localhost;Initial Catalog=WCFTest;Integrated Security=True;Pooling=False"); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT Processes FROM SaveProcesses", con); 
     var result = cmd.ExecuteReader(); 

     if (result.HasRows) 
     { 
      con.Close(); 
      return true; 
     } 
     else 
     { 
      con.Close(); 
      return false; 
     } 
    } 
    } 

임 Listbox가 "loging.cs.servicereference6.Service1Client"로 채워지는 것처럼 내가 여기서 뭔가 잘못하고 있다는 것을 확신합니다.

wcf를 구현하는 방법에 대한 아이디어가 있으십니까?

답변

1

일반적으로 WBF를 사용하여 Db에서 데이터를 가져 오려고 할 때 문자열에서 개체를 직렬화 한 다음 클라이언트 수준에서 역 직렬화합니다. 스 니펫에서 DataTable을 반환하고 직렬화 한 다음 목록 상자를 채워야 할 때 deserialize해야합니다.

public string GetDataTableFromDB() 
{ 
    // your code to retrieve from DB the DataTable 
    // there are plenty examples here in stackoverflow 
    // I will use "retrievedDataTable" name for the retrieved table 

    return Serialize<DataTable>(retrievedDataTable);   
} 

것은 확실히 : 내가 좋아하는 뭔가를 구현하는 것입니다 귀하의 Service.svc.cs 파일에서

[OperationContract] 
string GetDataTableFromDB(); 

: 내가 좋아하는 뭔가를 선언하여 IService 인터페이스에서 : 내가 할 줄 것은 이것이다 직렬화가 제대로 작동하는 경우 직렬화하려고하는 개체에 [DataMember] 플래그가없는 경우 JSON이 불만 할 수 있으므로 DataTable 개체가 포함될 클래스를 만듭니다. 그래서 :

클라이언트에서
[DataContract] 
public class Result 
{ 
    [DataMember] 
    public DataTable ResultDataTable { get; set; } 
} 

, 나는 데이터 테이블을 가지고하는 방법을 호출 할 것 :

public class JsonHelper 
{ 
    public static string JsonSerializer<T>(object obj) 
    { 
     try 
     { 
      if (obj == null) 
       return null; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); 
       serializer.WriteObject(ms, obj); 
       ms.Position = 0; 

       using (StreamReader reader = new StreamReader(ms)) 
       { 
        return reader.ReadToEnd(); 
       } 
      } 
     } 
     catch { return null; } 
    } 

    public static T JsonDeserialize<T>(string source) 
    { 
     try 
     { 
      if (source == null) 
       return default(T); 

      using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(source))) 
      { 
       DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
       if (ms.Length == 0) 
        return default(T); 

       return (T)serializer.ReadObject(ms); 
      } 
     } 
     catch { return default(T); } 
    } 
} 

I :

public void ShowData2() 
{ 
    try 
    { 
     ServiceReference6.Service1Client obj6 = new ServiceReference6.Service1Client(); 
     DataTable table = Deserialize<DataTable>(obj6.SelectSavedProcessInformation()); 
     if(table != null) 
     { 
      foreach(DataRow row in table.Rows) 
      { 
       // fill the listbox 
      } 
     } 

내가 사용하는 seirialization 및 역 직렬화 코드는이입니다 직렬화로 DataTable을 사용하지는 않았지만 제대로 작동했으면 좋겠다.

+0

아쉽게도 알려주세요. 도움을 주셔서 감사합니다 – Andrew

+0

뭔가 이해가 안되면 그냥 알려주세요 – davideberdin

+0

확실히, 그냥 wcf에서 텍스트 상자에 빠르게로드를 완료하려고합니다. 일단 내가 아픈이 해결책을 시도해보십시오 :) – Andrew

관련 문제