代码之家  ›  专栏  ›  技术社区  ›  goric

返回WCF/.NET中的数据表

  •  47
  • goric  · 技术社区  · 16 年前

    当我从头开始创建一个DataTable时,如下所示,没有任何问题。该表已创建、填充并返回给客户端,一切正常:

    [DataContract]
    public DataTable GetTbl()
    {
        DataTable tbl = new DataTable("testTbl");
        for(int i=0;i<100;i++)
        {
            tbl.Columns.Add(i);
            tbl.Rows.Add(new string[]{"testValue"});
        }
        return tbl;
    }
    

    然而,当我走出去点击数据库创建表时,如下所示,我得到一个CommunicationException“底层连接已关闭:连接意外关闭”

    [DataContract]
    public DataTable GetTbl()
    {
        DataTable tbl = new DataTable("testTbl");
        //Populate table with SQL query
    
        return tbl;
    }
    

    正在服务器端正确填充该表。它比我循环使用并返回的测试表小得多,而且查询又小又快——这里没有超时或大数据传输的问题。使用相同的确切功能和数据契约/服务契约/行为契约。

    为什么填充表的方式会影响表的成功返回?

    8 回复  |  直到 9 年前
        1
  •  83
  •   saluce jkm    9 年前

    对于任何有类似问题的人,我已经解决了我的问题。它有好几层。

    • 当服务引用在客户端更新时,配置有时也不会正确更新(例如,更改服务器上的配置值不会始终正确更新客户端。在调试过程中,我必须在客户端和服务器端多次更改Max..Size属性)
    • 要使DataTable可序列化,需要为其指定名称。默认构造函数没有为表指定名称,因此:

      return new DataTable();
      

      将不可序列化,而:

      return new DataTable("someName");
      

      请注意,可以随时通过将字符串指定给 TableName 数据表的属性。

      var table = new DataTable();
      table.TableName = "someName";
      

    希望这能帮助一些人。

        2
  •  15
  •   Chris Gillum    16 年前

      <system.diagnostics>
        <sources>
          <source name="System.ServiceModel" 
                  switchValue="Information" 
                  propagateActivity="true">
            <listeners>
              <add name="ServiceModelTraceListener" 
                   type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
                   initializeData="wcf-traces.svclog"/>
            </listeners>
          </source>
        </sources>
      </system.diagnostics>
    

    然后,您可以在.NET Framework SDK(或Visual Studio)中提供的SvcTraceViewer.exe实用程序中打开生成的文件。在我的计算机上,可以在%PROGRAMFILES%\Microsoft SDK\Windows\v6.0A\Bin\SvcTraceViewer.exe中找到它。

        3
  •  5
  •   Jani5e    13 年前

    我将数据表添加到一个数据集中,并像这样返回表。。。

    DataTable result = new DataTable("result");
    
    //linq to populate the table
    
    Dataset ds = new DataSet();
    ds.Tables.Add(result);
    return ds.Tables[0];
    

    :)

        4
  •  5
  •   Peter Mortensen Len Greski    9 年前

    除了为所有绑定属性设置最大值之外。

    确保从webservice传递/返回的每个表都必须有一个表名,即 table.tablename 属性不应为空。

        5
  •  4
  •   Peter Mortensen Len Greski    9 年前

    您需要的属性是OperationContract(在接口上)/操作行为(在方法上):

    [ServiceContract]
    public interface ITableProvider
    {
        [OperationContract]
        DataTable GetTbl();
    }
    
    
    [OperationBehavior]
    public DataTable GetTbl(){
        DataTable tbl = new DataTable("testTbl");
        //Populate table with SQL query
    
        return tbl;
    }
    

    还有,在。。。我认为服务配置。。。您希望指定可以发送错误。您可能遇到了一个错误,比如消息大小太大等等。您可以通过修改阅读器配额等来修复这个错误。

    您可以在中更改读卡器配额等的设置 web.config / app.config 或者您可以在代码中的绑定实例上设置它。但是,如果你没有在默认情况下改变它,那可能就是你的问题所在。

    WSHttpBindingBase Members -查看ReaderQuotas属性以及MaxReceivedMessageSize属性。

        6
  •  2
  •   Sam    16 年前

    您可能超出了配额-datatable大于您的连接允许的最大数据包大小。

    您可能需要设置 水位标记 连接到更高的值。

        7
  •  1
  •   Mukesh Methaniya    8 年前

    返回类型失败的原因有三个: datatable 在WCF服务中

    • 必须指定数据表名称,如:

      MyTable=new DataTable("tableName");
      
    • system.data

    • 在上指定属性 数据表

      [DataMember]
      public DataTable MyTable{ get; set; }
      
        8
  •  0
  •   Paul Mrozowski    16 年前

    话虽如此,还提到的SvcTraceViewer实用程序非常棒。我确实遇到过一些情况,它没有我希望的那么有用,但总的来说,它是分析通信流和错误的好工具。