Microsoft.SqlServer.Types.SqlGeography反序列化错误



我们的生产应用程序最近开始获得难以捉摸的"XML文档(16110(中存在错误"直到几天前,一切都按预期进行。我无法访问服务器日志以查看是否执行了任何意外的更新,但我想不出为什么它一直运行良好,现在却没有。仅供参考,这是在从web服务加载数据集时发生的。罪魁祸首列的数据类型是Geography,我可以确认Microsoft.SqlServer.Types的正确版本存在于客户端和服务器端"这里不允许"是我想不出来的吗?!?!

以下是完整的错误消息:

System.InvalidOperationException was caught
HResult=-2146233079
Message=There is an error in XML document (1, 6110).
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at DataFutures.DatabaseRoutines.DFIWebTier.DFIWebTier.Web_ReturnLoadedDataSet(String TableName_String, Boolean UseStoredProcedure_Boolean, String SQLCommandOrStoredProcedureName_String, String ParameterName_String, String SelectValue_String, String ParameterName2_String, String SelectValue2_String, SQLParameter_Class[] SQLParameter_SQLParameter_Class, String ConnectionString_String, String Database_String) in C:DevAppsTeamServerGeneric RoutinesDLLsDatabaseRoutinesWeb ReferencesDFIWebTierReference.vb:line 240
at DataFutures.DatabaseRoutines.DF_DataBaseClass.Database_Return_LoadedDataSet(String DataTable_String, Boolean UseStoredProcedure_Boolean, String SQLCommandOrStoredProcedureName_String, String ParameterName_String, String SelectValue_String, String ParameterName2_String, String SelectValue2_String, String ConnectionString_String, SqlTransaction SQL_SqlTransaction, List`1 SQLParameter_SQLParameter_Class, String Database_String) in C:DevAppsTeamServerGeneric RoutinesDLLsDatabaseRoutinesClassesDF_DatabaseClass.vb:line 1442
at DataFutures.DatabaseRoutines.DF_DataBaseClass.get_ExecuteReturnLoadedDataSet() in C:DevAppsTeamServerGeneric RoutinesDLLsDatabaseRoutinesClassesDF_DatabaseClass.vb:line 736
at DataFutures.Maintenance_Health.FacilityIC_Form.LoadTabPage_GeneralTab() in C:DevAppsTeamServerCareScopeModulesMaintenanceFacilityFacilityIC_Form.vb:line 3905
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=Type 'Microsoft.SqlServer.Types.SqlGeography, Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' is not allowed here. See https://go.microsoft.com/fwlink/?linkid=2132227 for more information.
Source=System.Data
StackTrace:
at System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter)
at System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode)
at System.Data.DataColumn.set_DataType(Type value)
at System.Data.XSDSchema.SetProperties(Object instance, XmlAttribute[] attrs)
at System.Data.XSDSchema.HandleElementColumn(XmlSchemaElement elem, DataTable table, Boolean isBase)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement node)
at System.Data.XSDSchema.HandleDataSet(XmlSchemaElement node, Boolean isNewDataSet)
at System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
at System.Data.DataSet.ReadXSDSchema(XmlReader reader, Boolean denyResolving)
at System.Data.DataSet.ReadXml(XmlReader reader, XmlReadMode mode, Boolean denyResolving)
at System.Data.DataSet.ReadXmlSerializable(XmlReader reader)
at System.Data.DataSet.System.Xml.Serialization.IXmlSerializable.ReadXml(XmlReader reader)
at System.Xml.Serialization.XmlSerializationReader.ReadSerializable(IXmlSerializable serializable, Boolean wrappedAny)
at System.Xml.Serialization.XmlSerializationReader.ReadSerializable(IXmlSerializable serializable)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDFIWebTier.Read6_Item()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer7.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
InnerException: 

原因就在链接中。您必须选择序列化除基本类型之外的其他类型。您可能已经为以前版本的Spatial类型配置了此配置,但当它们在服务器上更新时,客户端上的配置没有更新。

这里有一个例子:

using System.Data.SqlClient;
using Microsoft.SqlServer.Types;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Threading.Tasks;
namespace SqlClientTest
{
class Program
{
static void Main(string[] args)
{

var constr = "server=localhost;database=master;integrated security=true;";
using (var con = new SqlConnection(constr))
{
con.Open();
Type[] extraAllowedTypes = new Type[]
{
typeof(SqlGeography)
};
AppDomain.CurrentDomain.SetData("System.Data.DataSetDefaultAllowedTypes", extraAllowedTypes);
var sel = new SqlCommand("select geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326) shape", con);
var da = new SqlDataAdapter(sel);
var ds = new DataSet();
da.Fill(ds);
var ms = new MemoryStream();
ds.WriteXml(ms, XmlWriteMode.WriteSchema);
ms.Position = 0;
using (var f = File.OpenWrite("out.xml"))
{
ms.CopyTo(f);
}
ms.Position = 0;
var ds2 = new DataSet();
ds2.ReadXml(ms);
}

}
}
}

最新更新