程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0 WebService中傳遞DataTable參考

ASP.NET 2.0 WebService中傳遞DataTable參考

編輯:關於ASP.NET

在2.0正式版發布之前,就滿天的看到關於DataTable支持序列化的新特性宣傳,滿以為從此以後使用DataTable就和DataSet一樣方便了,結果在應用項目的時候才發現並非那麼回事。

DataTable是支持序列化了,但是微軟並沒有把他做的特別方便,還需要我們自己來做一些工作之後才能夠在WebService裡面傳遞DataTable,否則在引用DataTable的時候會發現DataTable變成了一個什麼Proxy類型。

首先編寫類DataTableSchemaImporterExtension,代碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization.Advanced;
using System.Collections;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Xml;
using System.Data;
namespace Xrinehart.Tools.WebService.SchemaImporter
{
   class DataTableSchemaImporterExtension : SchemaImporterExtension
   {
     // DataTableSchemaImporterExtension is used for WebServices, it is used to recognize the schema for DataTable within wsdl
     Hashtable importedTypes = new Hashtable();

     public override string ImportSchemaType(string name, string schemaNamespace, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider)
     {
       IList values = schemas.GetSchemas(schemaNamespace);
       if (values.Count != 1)
       {
         return null;
       }
       XmlSchema schema = values[0] as XmlSchema;
       if (schema == null)
         return null;
       XmlSchemaType type = (XmlSchemaType)schema.SchemaTypes[new XmlQualifiedName(name, schemaNamespace)];
       return ImportSchemaType(type, context, schemas, importer, compileUnit, mainNamespace, options, codeProvider);
     }

     public override string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider)
     {
       if (type == null)
       {
         return null;
       }
       if (importedTypes[type] != null)
       {
         mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
         compileUnit.ReferencedAssemblies.Add("System.Data.dll");
         return (string)importedTypes[type];
       }
       if (!(context is XmlSchemaElement))
         return null;

       if (type is XmlSchemaComplexType)
       {
         XmlSchemaComplexType ct = (XmlSchemaComplexType)type;
         if (ct.Particle is XmlSchemaSequence)
         {
           XmlSchemaObjectCollection items = ((XmlSchemaSequence)ct.Particle).Items;
           if (items.Count == 2 && items[0] is XmlSchemaAny && items[1] is XmlSchemaAny)
           {
             XmlSchemaAny any0 = (XmlSchemaAny)items[0];
             XmlSchemaAny any1 = (XmlSchemaAny)items[1];
             if (any0.Namespace == XmlSchema.Namespace && any1.Namespace == "urn:schemas-microsoft-com:xml-diffgram-v1")
             {
               string typeName = typeof(DataTable).FullName;
               importedTypes.Add(type, typeName);
               mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
               compileUnit.ReferencedAssemblies.Add("System.Data.dll");
               return typeName;
             }
           }
         }
       }
       return null;
     }
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved