2011-08-31 79 views
2

可能重复:
VS2003 Web Reference for a WCF Service has Extra "IdSpecified" ParameterWeb服务中的对象不返回整数数据

谢谢大家。我完全错过了。是的,班级名称很糟糕。

我有一个Web服务(ASMX),它返回一个包含数组的对象。

我首先定义我的响应对象:

APIResponse response = new APIResponse(); 

填充一个DataTable:

dtHolder = SqlHelper.ExecuteDatatable(connstring, CommandType.StoredProcedure, strSelect, aParams); 

创建我的查询结果的持有人:

API036RsBkgDetRec[] BkgDetRec_Array = new API036RsBkgDetRec[dtHolder.Rows.Count]; 
      int i = 0; 

      foreach (DataRow row in dtHolder.Rows) 
      { 
       BkgDetRec_Array[i] = new API036RsBkgDetRec(); 

       BkgDetRec_Array[i].eqoEqszId = row[0].ToString(); 
       BkgDetRec_Array[i].eqoEqtpId = row[1].ToString(); 
       BkgDetRec_Array[i].eqoEqhtId = row[2].ToString(); 
       BkgDetRec_Array[i].qty = Convert.ToInt32(row[3]); 
       BkgDetRec_Array[i].receiveQty = Convert.ToInt32(row[4]); 
       BkgDetRec_Array[i].emptyTally = Convert.ToInt32(row[5]); 
       BkgDetRec_Array[i].maxEmpty = Convert.ToInt32(row[6]); 
       BkgDetRec_Array[i].chsQty = Convert.ToInt32(row[7]); 
       BkgDetRec_Array[i].chsTally = Convert.ToInt32(row[8]); 

       i++; 
      } 

和填充阵列我返回(bkgDetTable)与上面刚刚填充的持有者阵列:

response.bkgDetTable = BkgDetRec_Array; 

当我捕获输出时,我看到没有任何整数字段正在创建,即使当我单步执行代码时,它们也会填充实数。对象API036RsBkgDetRec也将它们定义为整数值。只有定义为字符串的字符串才会出现。

<bkgDetTable xmlns="http://sdfsd/xsd"> 
<eqoEqhtId>96</eqoEqhtId> 
<eqoEqszId>40</eqoEqszId> 
<eqoEqtpId>DR</eqoEqtpId> 
</bkgDetTable> 

这里是API036RsBkgDetRec的定义:

public partial class API036RsBkgDetRec 
{  
private int chsQtyField; 

private bool chsQtyFieldSpecified; 

private int chsTallyField; 

private bool chsTallyFieldSpecified; 

private int emptyTallyField; 

private bool emptyTallyFieldSpecified; 

private string eqoEqhtIdField; 

private string eqoEqszIdField; 

private string eqoEqtpIdField; 

private int maxEmptyField; 

private bool maxEmptyFieldSpecified; 

private int qtyField; 

private bool qtyFieldSpecified; 

private int receiveQtyField; 

private bool receiveQtyFieldSpecified; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=0)] 
public int chsQty 
{ 
    get 
    { 
     return this.chsQtyField; 
    } 
    set 
    { 
     this.chsQtyField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool chsQtySpecified 
{ 
    get 
    { 
     return this.chsQtyFieldSpecified; 
    } 
    set 
    { 
     this.chsQtyFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=1)] 
public int chsTally 
{ 
    get 
    { 
     return this.chsTallyField; 
    } 
    set 
    { 
     this.chsTallyField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool chsTallySpecified 
{ 
    get 
    { 
     return this.chsTallyFieldSpecified; 
    } 
    set 
    { 
     this.chsTallyFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=2)] 
public int emptyTally 
{ 
    get 
    { 
     return this.emptyTallyField; 
    } 
    set 
    { 
     this.emptyTallyField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool emptyTallySpecified 
{ 
    get 
    { 
     return this.emptyTallyFieldSpecified; 
    } 
    set 
    { 
     this.emptyTallyFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=3)] 
public string eqoEqhtId 
{ 
    get 
    { 
     return this.eqoEqhtIdField; 
    } 
    set 
    { 
     this.eqoEqhtIdField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=4)] 
public string eqoEqszId 
{ 
    get 
    { 
     return this.eqoEqszIdField; 
    } 
    set 
    { 
     this.eqoEqszIdField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=5)] 
public string eqoEqtpId 
{ 
    get 
    { 
     return this.eqoEqtpIdField; 
    } 
    set 
    { 
     this.eqoEqtpIdField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=6)] 
public int maxEmpty 
{ 
    get 
    { 
     return this.maxEmptyField; 
    } 
    set 
    { 
     this.maxEmptyField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool maxEmptySpecified 
{ 
    get 
    { 
     return this.maxEmptyFieldSpecified; 
    } 
    set 
    { 
     this.maxEmptyFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=7)] 
public int qty 
{ 
    get 
    { 
     return this.qtyField; 
    } 
    set 
    { 
     this.qtyField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool qtySpecified 
{ 
    get 
    { 
     return this.qtyFieldSpecified; 
    } 
    set 
    { 
     this.qtyFieldSpecified = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Order=8)] 
public int receiveQty 
{ 
    get 
    { 
     return this.receiveQtyField; 
    } 
    set 
    { 
     this.receiveQtyField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool receiveQtySpecified 
{ 
    get 
    { 
     return this.receiveQtyFieldSpecified; 
    } 
    set 
    { 
     this.receiveQtyFieldSpecified = value; 
    } 
} 
} 

任何想法?

+0

我们可以看到API036RsBkgDetRec的定义吗? –

+0

这是一个WCF服务还是ASMX? –

+6

选择'API036RsBkgDetRec'作为类名的开发者应该面临审判并由同行陪审团判决。 –

回答

1

你会发现,每个属性值类型(整数,双,日期时间,......),你有一个XXXSpecified布尔属性。例如,你有:

public int maxEmpty 

public bool maxEmptySpecified 

当您导入使用Wsdl.exe用一个WCF Web服务(或添加在Visual Studio Web引用)这些属性生成。每次设置其相应的值类型属性值时,都需要将它们设置为true

我同意这是完全废话,但事实就是这样。 ASMX现在已被弃用。

2

对于所有的INT领域,你有两个领域:

  • 实际int领域,我相信你已经设置到适当值(private int emptyTallyField;

  • 但你有一个字段名为private bool emptyTallyFieldSpecified;其中必须设置为true - 否则,您设置的int值w生病不被序列化了

这样做的原因是因为像string字段的引用类型字段,你可以有NULL来表示“没有价值”方面,你可以有一个空字符串或任何其他字符串在那里。

对于值类型,如int - 怎么回事,你会表示“没有值指定”呢?如果你把int字段设置为0 - 是0,因为你想要“零”作为值,或者是“0”,因为你真的想说“没有价值”。由于这个原因,所有的值类型都有这个额外的(fieldname)specified属性,它表示是否存在实际值。如果该指定标志没有被设置(并且它没有被默认设置),那么你没有任何价值 - 因此没有东西被序列化出来。