2012-01-27 51 views
1

我已经完成了以下教程: http://www.anddev.org/networking-database-problems-f29/connecting-to-mysql-database-t50063.html 用于连接android设备到sqlserver(2005)使用php。我检查了我的php脚本,它运行并且正常运行。当我运行我的程序,我得到以下错误:JSON解析错误,当连接android设备到SqlServer 2005

01-26 14:17:43.491: E/log_tag(331): Error parsing data org.json.JSONException: Value Connection of type java.lang.String cannot be converted to JSONArray 
01-27 09:24:13.610: E/log_tag(404): Error parsing data org.json.JSONException: Value Connection of type java.lang.String cannot be converted to JSONArray 
01-27 09:26:45.190: E/log_tag(437): Error parsing data org.json.JSONException: Value Connection of type java.lang.String cannot be converted to JSONArray 
01-27 09:31:14.221: E/log_tag(471): Error parsing data org.json.JSONException: Value Connection of type java.lang.String cannot be converted to JSONArray 
01-27 09:43:44.501: E/log_tag(504): Error parsing data org.json.JSONException: Value Connection of type java.lang.String cannot be converted to JSONArray 

我希望我的程序连接到数据库,并返回其所有人的的engineerID的名字是大于零。这里是我的代码:

package com.david.DbConnect; 


import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.LinearLayout; 
import android.widget.TextView; 


public class DbConnectActivity extends Activity { 
/** Called when the activity is first created. */ 

    TextView txt; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    // Create a crude view - this should really be set via the layout resources 
    // but since its an example saves declaring them in the XML. 
    LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
    txt = new TextView(getApplicationContext()); 
    rootLayout.addView(txt); 
    setContentView(rootLayout); 

    // Set the text and call the connect function. 
    txt.setText("Connecting..."); 
    //call the method to run the data retreival 
    txt.setText(getServerData(KEY_121)); 



} 
public static final String KEY_121 = "http://xxx.xxx.xx.xx/dbconnect.php"; //i use my real ip here 



private String getServerData(String returnString) { 

    InputStream is = null; 

    String result = ""; 
    //the year data to send 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("EngID","0")); 

    //http post 
    try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(KEY_121); 
      // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 

    }catch(Exception e){ 
      Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 

    //convert response to string 
    try{ 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
      } 
      is.close(); 
      result=sb.toString(); 
    }catch(Exception e){ 
      Log.e("log_tag", "Error converting result "+e.toString()); 
    } 
    //parse json data 
    try{ 
      JSONArray jArray = new JSONArray(result); 
      for(int i=0;i<jArray.length();i++){ 
        JSONObject json_data = jArray.getJSONObject(i); 
        Log.i("log_tag","ContactName: "+json_data.getInt("ContactName") 
        ); 
        //Get an output to the screen 
        returnString += "\n\t" + jArray.getJSONObject(i); 
      } 
    }catch(JSONException e){ 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
    } 
    return returnString; 
} 

} 

这里是我的PHP脚本:

<?php 
$serverName = "xxxxxx"; //serverName\instanceName 
$connectionInfo = array("Database"=>"xxxxxx", "UID"=>"xxxxxxxx", "PWD"=>"xxxxxxx"); 
$conn = sqlsrv_connect($serverName, $connectionInfo); 

if($conn) { 
    echo "Connection established.<br />"; 
}else{ 
    echo "Connection could not be established.<br />"; 
    die(print_r(sqlsrv_errors(), true)); 
} 

//----------------------------------------------- 
// Perform operations with connection. 
//----------------------------------------------- 
$sql = "SELECT ContactName FROM dbo.TBL_FACILITY_JOB_CALLS WHERE EngineerID>'".$_REQUEST['EngID']."'" ; 
$stmt = sqlsrv_query($conn, $sql); 
if ($stmt === false) { 
    die(print_r(sqlsrv_errors(), true)); 
} 

while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
     echo $row['ContactName']. "<br />"; 
} 

sqlsrv_free_stmt($stmt); 



while($e=sqlsrv_fetch_assoc($row)) 

       $output[]=$e; 

      print(json_encode($output)); 

    sqlsrv_close(); 





?> 

任何人都可以阐明这一些轻?它已经毁了我的头几天。谢谢

回答

3

您输错了PHP的数据。你不能输出的Json以外的任何数据,因此,您应该删除:

echo "Connection established.<br />"; 

和除任何其他echo'ed数据:

print(json_encode($output)); 

此外,你应该添加标题为JSON,之前发送任何数据输出:

header('Content-type: application/json'); 
+0

当我拿出echo'd数据时,我现在有一个连接错误:http连接错误org.apache.http.conn.HttpHostConnectException:连接到http://10.0.2.2被拒绝。有任何想法吗?? – DMC 2012-01-27 10:31:55

0

我认为你从服务器获得的数据不是Json文件的格式。你必须在该行的例外:

JSONArray jArray = new JSONArray(result); 
  1. 确保在结果字符串中,必须有JSON文件结构的数据。
  2. 从json提取数据相应的json文件的结构。