2017-01-16 5 views
0

C#을 배우고 있는데 하나의 할당에서 WPF 응용 프로그램 및 웹 참조를 사용하여 버튼 클릭시 Access 파일의 데이터를 DataGrid에 표시해야합니다.웹 서비스에 액세스하는 동안 WPF 응용 프로그램에서 SOAP 예외가 발생했습니다.

내가 해결할 수없는 오전 SOAP 예외는, 어떤 도움이 감사한다

, 사전에 감사합니다 -

웹 참조 ASMX 파일은 아래의 방법을 포함하고는, 그는 버튼 클릭시 호출 -

[WebMethod] 
    public ArrayList queryDB() 
    { 
     string selectStmt = "select * from Students"; 
     OleDbConnection conn_obj = new DBConnect().checkDBStatus(databaseLocation); 
     conn_obj.Open(); 

     OleDbCommand query = new OleDbCommand(selectStmt, conn_obj); 
     OleDbDataReader dbReader = query.ExecuteReader(); 

     ArrayList dbRecordList = new ArrayList(); 

     foreach (DbDataRecord dbRecord in dbReader) 
     { 
      dbRecordList.Add(dbRecord); 
     } 

     conn_obj.Close(); 
     return dbRecordList; 
    } 

WPF 파일의 코드는 다음과 같습니다 - "버튼 클릭 방법"

private void GetData_Click(object sender, RoutedEventArgs e) 
    { 
     ArrayList datagridList = (ArrayList) websrvc.queryDB(); 
     dataGrid.ItemsSource = datagridList; 
    } 

위의 코드에서 오류가 생성됩니다 - 수 없습니다 암시 C를 에 onvert 유형 '[] 객체'System.Collections.ArrayList '

따라서 웹을 통해 제안에 따라

, 아래의 코드 변경 -

private void GetData_Click(object sender, RoutedEventArgs e) 
    { 
     object obj = websrvc.queryDB(); 
     ArrayList datagridList = (ArrayList) obj; 
     dataGrid.ItemsSource = datagridList; 
    } 

이제 오류 없을 것 같다을, 하지만 난이 해결 할 수없는 나는 코드의 아래 라인에서 예외 -

object obj = websrvc.queryDB(); 

{ "System.Web.Services.Protocols.SoapException : 서버가 요청을 처리 할 수 ​​없습니다. ---> System.InvalidOperationException : XML 문서를 생성하는 중 오류가 발생했습니다. ---> System.InvalidOperationException : System.Data.Common.DataRecordInternal은 매개 변수없는 생성자가 없으므로 직렬화 할 수 없습니다. \ n System.Xml.Serialization.TypeDesc.CheckSupported() \ n (System.Xml.Serialization) \ n System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException (형식 형식) \ n System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive (문자열 이름, 문자열 ns)에서 \ n 형식 : TypeScope.GetTypeDesc (형식 형식, , Object o, Boolean xsiType) \ n Microsoft.Xml.Serialization.GeneratedWriter1.Write1_Object (String n, String ns, Object o, 부울 isNullable, 부울 needType) \ n Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1. Write2_queryDBResponse (Object [] p) \ n Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Serialize (Object objectSerialize, XmlSerializationWriter 작성기) \ n System.Xml.Serialization.XmlSeri에서 \ n alizer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces 네임 스페이스, String encodingStyle, String id) \ n - 내부 예외 스택 추적 끝 - \ n System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object System.Web.Services.Protocols.SoapServerProtocol.WriteReturns (Object [] returnValues, Stream outputStream) \ n System.Web.Services.Protocols.WebServiceHandler.WriteReturns (Object, String, String) [] returnValues은 \ n System.Web.Services.Protocols.WebServiceHandler.Invoke()에서 \ n ---

+0

여기에 잘못된 예외가 있다고 생각합니다.중요한 것은'System.Data.Common.DataRecordInternal은 매개 변수없는 생성자가 없으므로 직렬화 할 수 없습니다. '인 것 같습니다. 이는 기본적으로 직렬화하려는 클래스가 매개 변수없는 생성자가 없으므로 직렬화 할 수없는'DataRecordInternal'을 사용한다는 것을 의미합니다. 데이터를 다른 (자체 제작) 클래스에 저장해야합니다. –

+0

'dataGrid.ItemsSource = websrvc.queryDB();'는 어떻습니까? – Clemens

+0

귀하의 솔루션은 이미 여기에 있습니다 : http : //stackoverflow.com/questions/26546339/why-exception-occured-when-method-in-webservice-return-arraylist-in-c- rq = 1 – tabby

답변

0
  1. 웹 서비스 측의 클래스를 만듭니다 내부 예외 스택 추적 --- "}의 끝 이름) 클라이언트에게 보내고 자하는 모든 속성을 가진 학생.
  2. 이 클래스를 직렬화 가능으로 표시하십시오.
  3. DB 개체 속성을이 Student 클래스에 하나씩 매핑합니다.
  4. 서비스에서 ArrayList를 반환하는 대신 ArrayList()를 반환합니다.

이 기능이 작동하는지 알려주세요.