【问题标题】:Microsoft.SqlServer.Types.SqlGeography Deserialize ErrorMicrosoft.SqlServer.Types.SqlGeography 反序列化错误
【发布时间】:2020-11-08 09:00:55
【问题描述】:

我们的生产应用程序最近开始出现难以捉摸的“XML 文档 (1, 6110) 中存在错误”。直到几天前,一切都按预期工作。我无权访问服务器日志以查看是否执行了任何意外更新,但我想不出为什么它一直正常工作而现在却不行的原因。仅供参考,这是在从 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:\DevApps\TeamServer\Generic Routines\DLLs\DatabaseRoutines\Web References\DFIWebTier\Reference.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:\DevApps\TeamServer\Generic Routines\DLLs\DatabaseRoutines\Classes\DF_DatabaseClass.vb:line 1442
       at DataFutures.DatabaseRoutines.DF_DataBaseClass.get_ExecuteReturnLoadedDataSet() in C:\DevApps\TeamServer\Generic Routines\DLLs\DatabaseRoutines\Classes\DF_DatabaseClass.vb:line 736
       at DataFutures.Maintenance_Health.FacilityIC_Form.LoadTabPage_GeneralTab() in C:\DevApps\TeamServer\CareScope\Modules\Maintenance\Facility\FacilityIC_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: 

【问题讨论】:

  • 错误后面的链接 (go.microsoft.com/fwlink/?linkid=2132227) 没有提到 SqlGeography 作为反序列化方案支持的类型。问题不是“为什么它现在不起作用”,而是“为什么它以前起作用”(可能以前的数据中没有地理输入)?
  • 我同意“为什么它以前有效”。此功能已投入生产 3 年,并且有大量地理数据。上周五,就是它出现的时候。我已经追踪到客户端。我猜最近的 Windows 10 更新是罪魁祸首。因此,我计划在 7 月份进行更新,看看是否可以确定是哪一个并检查是否有热修复。

标签: asp.net sql-server vb.net serialization deserialization


【解决方案1】:

原因就在链接中。您必须选择对基本类型以外的类型进行序列化。您可能已经为以前版本的 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);

            }


        }
    }

}

【讨论】:

  • 谢谢,大卫!我将在我的数据库类中尝试一下,看看是否能解决它。
  • 这就解决了。谢谢!!作为参考,以下 Windows 更新是我的罪魁祸首。 support.microsoft.com/en-us/help/4565633/…
猜你喜欢
  • 2014-02-19
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2014-03-13
  • 2014-05-03
  • 2018-07-28
相关资源
最近更新 更多