我正在开发一个Android代码,点击按钮可以通过Web服务在远程数据库中插入数据。我的网络服务代码非常简单。它只接受一个参数,即android Spinner值,并将该值插入数据库
我已经使用HttpClient进行发布,但我无法成功完成任务。任何人都可以帮我解决这个问题吗?
以下是网络服务代码:
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";
}
}
}
以下是我对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();
}
}
这是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: com.android.internal.view.IInputMethodClient$Stub$Proxy@45004b40
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: org.apache.http.conn.EofSensorInputStream@44f4a4f8
11-07 12:20:50.490: DEBUG/dalvikvm(260): GC_EXPLICIT freed 759 objects / 54952 bytes in 1185ms
答案 0 :(得分:2)
你很可能错过这些行:(在httpclient.execute
之前添加它们)
httppost.setHeader("Accept", "application/json");
httppost.setHeader("Content-type", "application/json"); OR
httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
答案 1 :(得分:1)
您可能需要设置超时
您没有为请求定义内容类型
我将使用responsehandler来更容易地使用执行命令进行编程
答案 2 :(得分:1)
为了帮助找出问题的原因,请使Web服务返回“成功”而不执行任何其他操作。这样您就可以验证与Web服务的httpclient通信是否正常工作。然后添加数据库逻辑并继续进行故障排除。
答案 3 :(得分:1)
看起来问题很可能是您的网络服务或数据库的格式,因为您的Android代码看起来是正确的。如果我是你,我会尝试调试Web服务来找到问题。