2011-08-04 71 views
0

如何處理Android中的數據表>我的服務返回dataTable.How如何處理它?Android調用WCF服務,返回DataTable

public static final String APPURL = "http://192.168.1.213:6969/MySalesServices";  
private static final String METHOD_NAME = "SalesList"; 
private static final String NAMESPACE = "http://tempuri.org/"; 
private static String SOAP_ACTION = "http://tempuri.org/IMySalesServices/SalesList"; 

SoapPrimitive responsePrimitive = null; 
ArrayList<String> tablesName = new ArrayList<String>(); 
public void onCreate(Bundle savedInstanceState) { 
     .................. 

    } 

    public SoapPrimitive soapPrimitive(String METHOD_NAME, String SOAP_ACTION,String NAMESPACE, String URL) throws IOException, XmlPullParserException { 
    SoapPrimitive responses = null; 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); // set up 
    request.addProperty("strExec", strExecutive); 
    request.addProperty("strBusinessUnit", strBusinessUnit); 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // put all required data into a soap 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL); 
    httpTransport.debug = true; 

    try { 
     httpTransport.call(SOAP_ACTION, envelope); 
     responses = (SoapPrimitive) envelope.getResponse(); 

     }catch(SocketException ex){ 
      ex.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    return responses; 
} 

我得到了以下錯誤:

AnyType{element=anyType{complexType=anyType{choice=anyType{element=anyType{complexType=anyType{sequence=anyType{element=anyType{}; element=anyType{}; element=anyType{}; element=anyType{}; element=anyType{}; }; }; }; }; }; }; } 

請幫我

+0

你有沒有考慮爲您服務返回JSON提要並在Android應用在接收時,將它反序列化爲你的對象? Google的Gson庫對於這樣的事情來說非常完美。這也將是更輕量級,這是很好的網絡流量 – hooked82

+0

謝謝..我會盡力 – Piraba

回答

1

您返回方法類型爲字符串&音樂會它的數據表,以JSON作爲字符串,是做好辦法&容易

//Converting table to json 
    public String ConverTableToJson(DataTable dtDownloadJson) 
    { 
     string[] StrDc = new string[dtDownloadJson.Columns.Count]; 
     string HeadStr = string.Empty; 

     if (dtDownloadJson.Rows.Count > 0) 
      { 

      for (int i = 0; i < dtDownloadJson.Columns.Count; i++) 
      { 

       StrDc[i] = dtDownloadJson.Columns[i].Caption; 
       HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\","; 
      } 
     if (HeadStr.Length > 0) 
      { 
       HeadStr = HeadStr.Substring(0, HeadStr.Length - 1); 
       StringBuilder Sb = new StringBuilder(); 
       Sb.Append("{\"" + dtDownloadJson.TableName + "\" : ["); 

       for (int i = 0; i < dtDownloadJson.Rows.Count; i++) 
       { 

        string TempStr = HeadStr; 
        Sb.Append("{"); 

        for (int j = 0; j < dtDownloadJson.Columns.Count; j++) 
        { 
         TempStr = TempStr.Replace(dtDownloadJson.Columns[j] + j.ToString() + "¾", dtDownloadJson.Rows[i][j].ToString()); 
        } 

        Sb.Append(TempStr + "},"); 
       } 

       Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1)); 
       Sb.Append("]}"); 
       return Sb.ToString(); 
      }else 
      { 
      return "0"; 
      } 
      } 
      else 
      { 
       return "0"; 
      } 
    } 
+0

Thanks.Its greate answer.I面對這個問題超過兩天 – Piraba

0

你得到AINT錯誤在所有錯誤。至少,這是我在自己的應用程序中看到的行爲,使用的設置與您在那裏的設置非常相似。你有沒有嘗試將響應投射到SoapObject?然後您可以調用該SoapObject上的.getPropertyCount()方法來開始循環通過響應的內容。快速示例:

//Create a Transport object makes the webservice call 
HttpTransportSE httpTrans = new HttpTransportSE(URL); 
httpTrans.call(SOAP_ACTION, env); 

//Cast the object to SoapObject 
SoapObject storages = (SoapObject)env.getResponse(); 

//Loop trough the result 
for(int i = 0; i < storages.getPropertyCount(); i++) { 
    //Get a SoapObject for each storage 
    SoapObject storage = (SoapObject)storages.getProperty(i); 
} 

看到您得到的響應,您可能需要深入幾層才能獲取所需的數據。 6或7級深度。如果它是一個選項,我會更改從Web服務獲得的響應,以便更容易解析。