Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android如何利用ksoap2进行sql server操作实现登陆功能

$
0
0
   最近做了一个小学期的课程设计,一个桌面应用系统,一个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;
            }
        }

运行web当然这里还有一些其他的接口,目前就不再介绍了。我们这里只说一下实现返回简单的字符串的功能,返回数据集的下次讲。
这里写图片描述这里写图片描述
这会估计你就已经很清楚了,我们只需要在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 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>