2017-01-16 5 views
0

Я изучаю C#, и в одном из заданий я должен отображать данные из файла Access в DataGrid при нажатии кнопки с использованием приложения WPF и веб-ссылки.SOAP-исключение в приложении WPF при доступе к веб-сервису

Там является 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; 
    } 

Приведенный выше код создает ошибку - не может неявно с 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. TypeScope.GetTypeDesc (Тип типа, источник MemberInfo, Boolean directReference, Boolean throwOnError) \ n в System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException (тип типа) \ n в System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive (имя строки, строка ns , Object o, Boolean xsiType) \ n в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object (String n, String ns, Object o, Boolean isNullable, Boolean needType) \ n в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1. Write2_queryDBResponse (Object [] p) \ n в Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Serialize (Object objectToSerialize, XmlSerializationWriter writer) \ n в System.Xml.Serialization.XmlSeri alizer.Serialize (XmlWriter xmlWriter, Object o, XmlSerializerNamespaces пространства имен, String encodingStyle, String id) \ n --- Конец внутренней трассировки стека исключений --- \ n в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xmlWriter, Object o, пространства имен XmlSerializerNamespaces, String encodingStyle, String id) \ n в System.Web.Services.Protocols.SoapServerProtocol.WriteReturns (Object [] returnValues, поток outputStream) \ n в System.Web.Services.Protocols.WebServiceHandler.WriteReturns (объект [] returnValues) \ п на System.Web.Services.Protocols.WebServiceHandler.Invoke() \ п --- Конец внутренней трассировки стека исключений --- "}

+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. Отметить этот класс как serializable.
  3. Сопоставьте свойства объекта DB один за другим с этим классом Student.
  4. Из службы вместо возврата ArrayList верните ArrayList();

Сообщите мне, если это работает.