最近做了一个小学期的课程设计,一个桌面应用系统,一个android。由于之前做过一个web项目,用的是visual studio,感觉熟练了,所以桌面应用系统就选择了vs,用了wpf实现了桌面应用系统,数据库当然是sql server。但是到了做android的时候,遇到了麻烦,那就是android不能连接sql server,好方。通过各种查资料,发现通过使用第三方包ksoap2连接web server从而实现对sql server的操作。
工具:
Eclipse、ksoap2 3.0版、visual studio、sql server2008
首先,第三方包ksoap2的版本一定要选择正确,我最初在网上找的,是2.5.4版本的,写完代码之后一直有问题出现,找了很久才发现是版本的问题,我提供个下载吧,亲测可用。
这种方法的实现是基于web,所以最近基本的你要学会建一个web,这网上有很多教程,在这里就不写了。这时候你就会想在web到底做了什么,其实只有两件事,1、连接数据库;2、进行数据库的操作。对的,我们把数据库的操作放在了web端,这样我们在android端只需要传递一些参数给web端,然后web端处理参数,再将处理后的信息反馈给android端,很容易理解。
web端代码如下:
//web.config文件
<connectionStrings>
<!--数据库连接-->
<add name="ConnectionString" connectionString="Provider=SQLOLEDB.1;Data Source=.;Initial Catalog=shujujiegou;User Id=sa;Password=admin;"></add>
</connectionStrings>
//DataBase.cs文件中
public DataSet GetDataSet(string strSql, string tableName)
{
DataSet dataSet = new DataSet();
OleDbConnection conn = new OleDbConnection(ConnectionString);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(strSql, conn);
dataAdapter.Fill(dataSet, tableName);
return dataSet; //返回这个数据集
}
public void execsql(string strSql)
{
OleDbConnection dbconn = new OleDbConnection(ConnectionString);//数据库连接
OleDbCommand comm = new OleDbCommand(strSql, dbconn);//定义并初始化命令对象
dbconn.Open();//打开连接
comm.ExecuteNonQuery();//执行命令
dbconn.Close();//关闭连接
}
//server1.asmx.cs文件中
[WebMethod(Description = "普通用户登录")]
public bool Selectpeople(string username, string password)
{
string strsql;
string ss = "aaa";
strsql = "select * from tuser where username ='" + username + "' and password = '" + password + "' and mark = 1";
DataSet dataSet = new DataSet(); //创建数据据
dataSet = database.GetDataSet(strsql, "usernamelist"); //将查询的当前用户存入数据集里
if (dataSet.Tables["usernamelist"].Rows.Count == 0)
{
return false;
}
else
{
return true;
}
}
当然这里还有一些其他的接口,目前就不再介绍了。我们这里只说一下实现返回简单的字符串的功能,返回数据集的下次讲。
这会估计你就已经很清楚了,我们只需要在android端找到你写的web地址,调用selectpeople接口,输入username和password这两个参数,然后android就不需要管了等着就接受web反馈的信息就行了。web端发聩一个bool型字符串,我们判断如果是true就是登陆成功,否则,登陆失败。很简单,复杂的xml解析ksoap2已经帮我们实现,下面解释如何实现上述过程。
android端代码:
1、获得4个重要的参数
// 命名空间
String nameSpace = "http://tempuri.org/";
// 调用的方法名称
String methodName = "Selectpeople";
// EndPoint
String endPoint = "http://192.168.1.102:8001/Service1.asmx";
// SOAP Action
String soapAction = "http://tempuri.org/Selectpeople";
这些东西去哪里找呐,当然是在你的web端
endpoint是你web打开的地址。
2、ksoap2的使用
public String getRemoteInfo(String nameSpace, String methodName, String endPoint, String soapAction, String name, String password) {
SoapObject rpc = new SoapObject(nameSpace, methodName);
rpc.addProperty("username", name); //你要输入的两个值
rpc.addProperty("password",password);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
// 等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
// 调用WebService
transport.call(soapAction, envelope); //执行
} catch (Exception e) {
e.printStackTrace();
}
// 获取返回的数据 (解析出xml)
SoapObject object = (SoapObject) envelope.bodyIn;
result = object.getPropertyAsString("SelectpeopleResult").toString().trim();
//这个selectpeople从哪里找请看下图
return result;
}
还有一件很重要的事,那就是android4.0版本之后不支持在主线程中进行这种操作,你要把他放到子线程中才能实现。下面是实现代码。
public class MainActivity extends ActionBarActivity {
final static String TAG = "MainActivity";
public EditText username;
public EditText userpassword;
private String result;
public static String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //调用父类 方法
requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题栏
setContentView(R.layout.activity_main); //加载一个布局
Button button1=(Button) findViewById(R.id.button1); //声明按钮
Button button2=(Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener() { //注册按钮
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent=new Intent(MainActivity.this,Register.class); //跳转至注册页面
startActivity(intent);
}
});
username=(EditText) findViewById(R.id.editText1); //获取用户名
userpassword=(EditText) findViewById(R.id.editText2); //获取密码
button1.setOnClickListener(new OnClickListener() { //登陆按钮点击事件
@Override
public void onClick(View arg0) {
//result="";
// TODO Auto-generated method stub
name=username.getText().toString(); //获取姓名的值
String password=userpassword.getText().toString(); //获取密码
// 命名空间
//http://localhost:50109/Service1.asmx
//http://192.168.1.100:8000/Service1.asmx
String nameSpace = "http://tempuri.org/"; //获取网站信息及调用方法
// 调用的方法名称
String methodName = "Selectpeople";
// EndPoint
String endPoint = "http://192.168.1.102:8001/Service1.asmx";
// SOAP Action
String soapAction = "http://tempuri.org/Selectpeople";
// 指定WebService的命名空间和调用的方法名
MyThread t=new MyThread(nameSpace,methodName,endPoint,soapAction,//子线程
name,password);
t.start();
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(result.equals("true")) //是否在数据库找到对应的值
{
Intent intent=new Intent(MainActivity.this,Main.class);
startActivity(intent);
finish();
}else{
Toast.makeText(MainActivity.this,"用户名不存在或者密码错误", Toast.LENGTH_SHORT).show();
}
}
});
}
// 通过Runnable接口和Thread类,得到线程返回值(子线程的具体实现)
private class MyThread extends Thread
{
private String nameSpace;
private String methodName;
private String endPoint;
private String soapAction;
private String name;
private String password;
public MyThread(String nameSpace, String methodName,
String endPoint, String soapAction, String name, String password){
this.nameSpace = nameSpace;
this.methodName = methodName;
this.endPoint = endPoint;
this.soapAction = soapAction;
this.name = name;
this.password = password;
}
@Override
public void run()
{
result = getRemoteInfo(nameSpace, methodName, endPoint,
soapAction,name,password);
}
}
/**
* @MethodName : getRemoteInfo
* @Description : 调用远程webservice方法
* @param nameSpace
* @param methodName
* @param endPoint
* @param soapAction
* @param params
* @param vals
* @return
*/
public String getRemoteInfo(String nameSpace, String methodName, //连接网站,获取xml
String endPoint, String soapAction, String name,
String password) {
SoapObject rpc = new SoapObject(nameSpace, methodName);
rpc.addProperty("username", name);
rpc.addProperty("password",password);
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
// 等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc);
HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
// 调用WebService
transport.call(soapAction, envelope); //执行
} catch (Exception e) {
e.printStackTrace();
}
// 获取返回的数据 (解析出xml)
SoapObject object = (SoapObject) envelope.bodyIn;
result = object.getPropertyAsString("SelectpeopleResult").toString().trim();
return result;
}
}
实现效果:
目前返回简单的字符串就这样,下次补如何返回dataset数据集,就这样(这个csdn写文章时图片怎么变小)。
作者:bug_move 发表于2016/10/17 12:35:21 原文链接
阅读:7 评论:0 查看评论