2011-08-31 84 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屬性,它表示是否存在實際值。如果該指定標誌沒有被設置(並且它沒有被默認設置),那麼你沒有任何價值 - 因此沒有東西被序列化出來。