【发布时间】:2017-01-16 07:07:50
【问题描述】:
我正在学习 C#,在其中一项作业中,我必须在使用 WPF 应用程序和 Web 参考单击按钮时将 Access 文件中的数据显示到 DataGrid 中。
有一个我无法解决的 SOAP 异常,感谢任何帮助,在此先感谢 -
Web 参考 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;
}
上面的代码正在创建一个错误 - 无法将类型'object[]'隐式转换为'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(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)\n 在 System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type)\n 在 System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String 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(Objec t[] p)\n 在 Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Serialize(Object objectToSerialize, XmlSerializationWriter writer)\n 在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle , String id)\n --- 内部异常堆栈跟踪结束 ---\n 在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)\n 在 System .Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)\n 在 System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)\n 在 System.Web.Services.Protocols。 WebServiceHandler.Invoke()\n --- 内部异常堆栈跟踪结束 ---"}
【问题讨论】:
-
我认为您在这里查看了错误的异常。重要的似乎是
System.Data.Common.DataRecordInternal cannot be serialized because it does not have a parameterless constructor。这基本上意味着您尝试序列化的某些类使用DataRecordInternal,它没有无参数构造函数,因此无法序列化。您需要将数据保存在不同的(自制)类中。 -
dataGrid.ItemsSource = websrvc.queryDB();怎么样? -
我认为您的解决方案已经在这里了:stackoverflow.com/questions/26546339/…
标签: c# asp.net wpf web-reference