2011-11-07 22 views
6

Estoy trabajando en un código Android que al hacer clic en un botón inserta datos en una base de datos remota a través de un servicio web. Mi código de servicio web es bastante simple. Simplemente toma en un parámetro que es el valor de android Spinner e inserta ese valor en la base de datosAlimenta datos en la base de datos desde la aplicación de Android a través del servicio web

He usado HttpClient para publicar pero no puedo tener éxito en hacer mi tarea. ¿Alguien puede ayudarme con este problema?

Aquí es el código de servicio web:

  using System; 
      using System.Collections; 
      using System.ComponentModel; 
      using System.Data; 
      using System.Linq; 
      using System.Web; 
      using System.Web.Services; 
      using System.Web.Services.Protocols; 
      using System.Xml.Linq; 
      using System.Data.SqlClient; 


     namespace putdata 
      { 
     /// <summary> 
     /// Summary description for Service1 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService] 
public class Service1 : System.Web.Services.WebService 
{ 

    [WebMethod] 
    public String put(String value) 
    { 
     int count=1; 
     int rows; 

     SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"); 
     try 
     { 
      myConnection.Open(); 
      count++; 
      SqlCommand myCommand = new SqlCommand(); 
      myCommand.Connection = myConnection; 
      myCommand.CommandText = "insert into record values('"+ count +"','" + value + "')"; 
      myCommand.Parameters.Add("@value", SqlDbType.VarChar).Value = value; 
      rows = myCommand.ExecuteNonQuery(); 
      SqlDataReader myReader = myCommand.ExecuteReader(); 

      } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      myConnection.Close(); 
     } 

     return "success"; 
    } 

     } 
    } 

Aquí es mi principal lógica para el código de Android:

  public void onClick(View v) { 

     String spinnerval1=""; 
     String spinnerval2=""; 

     // Perform action on clicks 
     Toast.makeText(Mark.this, "calling web service", Toast.LENGTH_LONG).show(); 
     if (v == findViewById(R.id.button)) { 
      // prepare the dialog box 
      Button progress = (Button) findViewById(R.id.button); 
      progress.setOnClickListener((OnClickListener) Mark.this); 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://10.0.2.2/enterdata/Service1.asmx"); 


      try 
      { 
      String result; 
      JSONObject obj = new JSONObject(); 
      obj.put("Maths",spinnerval1); 
      obj.put("Science",spinnerval2); 


      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("value1", spinnerval1)); 
      nameValuePairs.add(new BasicNameValuePair("value2", spinnerval2)); 
      httppost.setEntity((HttpEntity) new UrlEncodedFormEntity(nameValuePairs)); 

      // Execute HTTP Post Request 
      HttpResponse httpResponse = httpclient.execute(httppost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 

      if (httpEntity != null) 
      { 
       InputStream is = httpEntity.getContent(); 
       result = is.toString(); 
       Log.i("Result is ", "Result: " + result); 
      } 

      } 

      catch (ClientProtocolException e1) 
      { 
       // TODO Auto-generated catch block 
      } 
      catch (IOException e) { 
       // TODO Auto-generated catch block 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



      ProgressDialog dialog=new ProgressDialog(Mark.this); 

      // make the progress bar cancelable 
      dialog.setCancelable(true); 

      // set a message text 
      dialog.setMessage("Loading..."); 

      dialog.show(); 

     } 

    }  

Aquí está el Logcat:

11-07 12:20:28.970: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example/.Mark } 

    11-07 12:20:29.361: DEBUG/AndroidRuntime(299): Shutting down VM 
    11-07 12:20:29.390: DEBUG/dalvikvm(299): Debugger has detached; object registry had 1 entries 
    11-07 12:20:29.460: INFO/AndroidRuntime(299): NOTE: attach of thread 'Binder Thread #3' failed 
    11-07 12:20:29.470: INFO/ActivityManager(58): Start proc com.example for activity com.example/.Mark: pid=306 uid=10060 gids={3003, 1015} 
    11-07 12:20:31.170: INFO/ActivityManager(58): Displayed activity com.example/.Mark: 1809 ms (total 1809 ms) 
    11-07 12:20:39.341: DEBUG/dalvikvm(127): GC_EXPLICIT freed 1321 objects/73848 bytes in 161ms 
    11-07 12:20:40.981: WARN/InputManagerService(58): Window already focused, ignoring focus gain of: [email protected] 
    11-07 12:20:44.440: DEBUG/dalvikvm(201): GC_EXPLICIT freed 109 objects/9024 bytes in 190ms 
    11-07 12:20:48.840: INFO/Result is(306): Result: [email protected] 
    11-07 12:20:50.490: DEBUG/dalvikvm(260): GC_EXPLICIT freed 759 objects/54952 bytes in 1185ms 
+0

lógica Anroid parece correcto (hasta objeto JSON sin usar), y no veo ningún problema en el fragmento Logcat. ¿Pero qué pasa en el servidor? ¿Puedes publicar registros del servidor también? –

+0

¿Quiere decir el código del servicio web? –

+0

I men salida del servicio web. Es la naturaleza de las aplicaciones cliente-servidor, que tienen fuentes de problemas en ambos lados (ya veces en el medio) –

Respuesta

2

u r falta de estas líneas muy probablemente: (añadir antes httpclient.execute)

httppost.setHeader("Accept", "application/json"); 
    httppost.setHeader("Content-type", "application/json"); OR 

    httppost.setHeader("Content-type", "application/x-www-form-urlencoded"); 
1

que pueda tener para establecer un tiempo de espera

no ha definido un tipo de contenido para la petición

y yo utilizaría un responsehandler para la programación más fácil con comando de ejecución

+0

Sí agregará ese tipo de contenido y código de tiempo de espera. Básicamente, quiero que cuando se inserten los datos, debería obtener alguna respuesta, que debe ser "exitosa" según mi código de servicio web y quiero pasar a la siguiente actividad después de obtener el "éxito". Entonces, ¿cómo debo hacer eso y sí cómo usar responseHandler? –

1

Para ayudar a aislar la causa del problema, hacen que la devolución servicio web "éxito" sin hacer Algo más. De esta forma, puede verificar que la comunicación httpclient con el servicio web esté funcionando correctamente. Luego, agregue la lógica de la base de datos y continúe con la solución de problemas.

1

Parece que el problema es más probable con su servicio web o el formato de la base de datos, ya que su código de Android parece correcto. Si yo fuera tú, intentaría depurar el servicio web para localizar el problema.

Cuestiones relacionadas