首页 >数据库 >mysql教程 >Android通过webservice连接SQLServer 详细教程(数据库 服务器

Android通过webservice连接SQLServer 详细教程(数据库 服务器

WBOY
WBOY原创
2016-06-07 15:15:411741浏览

http://blog.csdn.net/zhyl8157121/article/details/8169172 http://blog.csdn.net/zhyl8157121/article/details/8169172 其实之前发过一篇这样的博文http://blog.csdn.net/zhyl8157121/article/details/7709552,但那个只是简单记录了一些自己的想法,并没有

http://blog.csdn.net/zhyl8157121/article/details/8169172

http://blog.csdn.net/zhyl8157121/article/details/8169172

其实之前发过一篇这样的博文http://blog.csdn.net/zhyl8157121/article/details/7709552,但那个只是简单记录了一些自己的想法,并没有想作为教程来看,后来由于一些朋友想要源代码,就附上了下载地址,但并没有做什么讲解,从现在开始,准备做一份详细的Android如何连接Sqlserver的教程.由于本人才疏学浅,如果有什么不对的地方欢迎大家批评指正.


        为了避免再次被说标题党,这里先说明些事情:

        第一,android没法直接连接SQLServer,起码我没有发现方法,想想看,sqlserver安装之后有多大,android程序是跑在手机上的,想让程序直接访问sqlserver,那手机要多大的内存?

        第二,本文是通过一个“桥梁”——webservice来间接访问SQLServer的,当然还有其他方法,感兴趣的同学可以自行百度。

        如果理解了上面两点,好了咱们继续。


         教程会拿一个具体的例子来讲,一步一步来,也许细节上还可以继续加工,但大致的流程就是这样的。

         本教程有五个部分:

  • 项目说明
  • 开发环境部署
  • 数据库设计
  • 服务器端程序设计
  • 客户端(android端)程序设计

项目说明

         这个项目意在实现一个简单的android连接Sqlserver的功能。

         就做一个简单的库存管理功能,包括对仓库内现有货物的查看、货物信息的增加&删除。

开发环境的部署

         今天主要讲解第一个部分,开发环境的部署.

操作系统:Windows764bit 旗舰版

         当然这个是什么基本无所谓,只是我是在这上面开发的,不过家庭普通版的貌似不能配置IIS,就是咱们后面要使用的一个服务.

android端:eclipse + ADT集成开发环境

         相信看到这个教程的基本都知道如何做这些了.如果真的是有哪位同学android开发环境没有配置好而来看这篇教程,请先移步->www.google.com

服务器:VisualStudio 2010 旗舰版

         这个是用来写website/webservice的,开发语言使用C# (即.net)

数据库:SQLServer2008 R2

         其实这个是什么版本也无所谓吧,教程使用的都是比较基本的东西,所以版本的差异基本可以忽略。

IIS 7.5:正确配置并开启IIS服务

         如果想将website/webservice发布出去就要开启这个服务。但是如果仅仅是在本地进行测试就不需要配置,直接在VS中运行就可以。

 

         其实我在开发的时候也只是配置IIS的时候遇到了一些问题,这里给出IIS的配置方法.

         http://wenku.baidu.com/view/95cf9fd9ad51f01dc281f1af.html这篇文库给的还是很详细的,我当初就是照着这个配置的。

数据库设计

数据库名称:StockManage

表设计

表名称:C

表说明:

列名

中文名称

数据型态

必填

说明

Cno

货物编号

Int

V

主键,自增

Cname

货物名称

String

 

 

Cnum

货物数量

Int

 

 

列名
中文名称 数据型态 必填 说明
Cno 货物编号 Int V 主键,自增
Cname 货物名称 String    
Cnum 货物数量 Int    

 

下图是设计表的时候的截图。

Android通过webservice连接SQLServer 详细教程(数据库 服务器

 

向表中输入内容

 Android通过webservice连接SQLServer 详细教程(数据库 服务器

吐槽一下:为什么这里猫、狗、电话都有,甚至还有Surface?!这只能说当时LZ在想这些……

 

 

服务器端程序设计(Webservice)

         其实服务端可以写成webservice也可以写成website,前者只是提供一种服务,而后者是可以提供用户界面等具体的页面,后者也就是咱们平时所说的“网站”。

         两者的区别:

  • Web Service 只提供程序和接口,不提供用户界面
  • Web Site 提供程序和接口,也提供用户界面(网页)

         由于咱们只是需要一个中介来访问sqlserver,所以写成webservice足够了。

         目标:写一个Website访问Sqlserver,获取数据并转换成xml格式,然后传递给android客户端。


1.      新建一个Webservice工程

Android通过webservice连接SQLServer 详细教程(数据库 服务器

2.      视图 -> 其它窗口 -> 服务器资源管理器

Android通过webservice连接SQLServer 详细教程(数据库 服务器

3.      右键数据连接 -> 添加连接

Android通过webservice连接SQLServer 详细教程(数据库 服务器

4.      选择Microsoft Sqlserver

Android通过webservice连接SQLServer 详细教程(数据库 服务器

5.      如下图所示选择(可以点击测试连接来检测连接是否成功,然后点击确定)

Android通过webservice连接SQLServer 详细教程(数据库 服务器

6.      数据库的查看和编辑也可以在VS中进行了

Android通过webservice连接SQLServer 详细教程(数据库 服务器

7.      先查看一下数据库属性并记录下连接属性

Android通过webservice连接SQLServer 详细教程(数据库 服务器

8.      新建一个类DBOperation,代码如下:

[csharp] view plaincopyprint?

  1. 使用 系统;  
  2. 使用 System.Data;  
  3. 使用 System.Configuration;  
  4. 使用 System.Linq;  
  5. 使用 System.Web;  
  6. 使用 System.Web.Security;  
  7. 使用 System.Web.UI;  
  8. 使用 System.Web.UI.HtmlControls;  
  9. 使用 System.Web.UI.WebControls;  
  10. 使用 System.Web.UI.WebControls.WebParts;  
  11. 使用 System.Xml.Linq;  
  12. 使用 System.Data.SqlClient;  
  13. 使用 System.Text.RegularExpressions;  
  14. 使用 System.Collections;  
  15. 使用 System.Collections.Generic;  
  16.   
  17. 命名空间 StockManageWebservice  
  18. {  
  19.     /// <摘要>  
  20.     /// 一个操作数据库的类,所有对SQLServer的操作都写在这个类中,使用的时候实例化一个然后直接调用就可以
  21.     /// 摘要>  
  22.     公共  DBOperation:IDisposable  
  23.     {  
  24.         公共 静态 SqlConnection sqlCon;  //用于连接数据库  
  25.   
  26.         //将换下面的关注之间的内容成上面记录下的属性中的连接字符串  
  27.         private String ConServerStr = @"数据源=BOTTLE-PC;初始目录=StockManage;集成安全性=True";  
  28.           
  29.         //默认构造函数  
  30.         公共 DBOperation()  
  31.         {  
  32.             if (sqlCon == null)  
  33.             {  
  34.                 sqlCon =  SqlConnection();  
  35.                 sqlCon.ConnectionString = ConServerStr;  
  36.                 sqlCon.Open();  
  37.             }  
  38.         }  
  39.            
  40.         //关闭/销毁函数,相当于Close()  
  41.         public void Dispose()  
  42.         {  
  43.             if (sqlCon != null)  
  44.             {  
  45.                 sqlCon.Close();  
  46.                 sqlCon = null;  
  47.             }  
  48.         }  
  49.           
  50.         ///   
  51.         /// 获取所有货物的信息  
  52.         ///   
  53.         /// 所有货物信息  
  54.         public List<string> selectAllCargoInfor()  
  55.         {  
  56.             List<string> list = new List<string>();  
  57.   
  58.             try  
  59.             {  
  60.                 string sql = "select * from C";  
  61.                 SqlCommand cmd = new SqlCommand(sql,sqlCon);  
  62.                 SqlDataReader reader = cmd.ExecuteReader();  
  63.   
  64.                 while (reader.Read())  
  65.                 {  
  66.                     //将结果集信息添加到返回向量中  
  67.                     list.Add(reader[0].ToString());  
  68.                     list.Add(reader[1].ToString());  
  69.                     list.Add(reader[2].ToString());  
  70.   
  71.                 }  
  72.   
  73.                 reader.Close();  
  74.                 cmd.Dispose();  
  75.   
  76.             }  
  77.             catch(Exception)  
  78.             {  
  79.   
  80.             }  
  81.             return list;  
  82.         }  
  83.   
  84.         ///   
  85.         /// 增加一条货物信息  
  86.         ///   
  87.         /// 货物名称  
  88.         /// 货物数量  
  89.         public bool insertCargoInfo(string Cname, int Cnum)  
  90.         {  
  91.             try  
  92.             {  
  93.                 string sql = "insert into C (Cname,Cnum) values ('" + Cname + "'," + Cnum + ")";  
  94.                 SqlCommand cmd = new SqlCommand(sql, sqlCon);  
  95.                 cmd.ExecuteNonQuery();  
  96.                 cmd.Dispose();  
  97.   
  98.                 return true;  
  99.             }  
  100.             catch (Exception)  
  101.             {  
  102.                 return false;  
  103.             }  
  104.         }  
  105.   
  106.         ///   
  107.         /// 删除一条货物信息  
  108.         ///   
  109.         /// 货物编号  
  110.         public bool deleteCargoInfo(string Cno)  
  111.         {  
  112.             try  
  113.             {  
  114.                 string sql = "delete from C where Cno=" + Cno;  
  115.                 SqlCommand cmd = new SqlCommand(sql, sqlCon);  
  116.                 cmd.ExecuteNonQuery();  
  117.                 cmd.Dispose();  
  118.   
  119.                 return true;  
  120.             }  
  121.             catch (Exception)  
  122.             {  
  123.                 return false;  
  124.             }  
  125.         }  
  126.     }  
  127. }  

9.      修改Service1.asmx.cs代码如下:

[csharp] view plaincopyprint?

  1. 使用 系统;  
  2. 使用 System.Collections.Generic;  
  3. 使用 System.Linq;  
  4. 使用 System.Web;  
  5. 使用 System.Web.Services;  
  6.   
  7. 命名空间 StockManageWebservice  
  8. {  
  9.     /// <摘要>  
  10.     /// Service1 的摘要说明  
  11.     /// 摘要>  
  12.     [WebService(命名空间 = "http://tempuri.org/")]  
  13.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  14.     [System.ComponentModel.ToolboxItem(false)]  
  15.     //若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消以下注释。  
  16.     // [System.Web.Script.Services.ScriptService]  
  17.     public class Service1 : System.Web.Services.WebService  
  18.     {  
  19.         DBOperation dbOperation = new DBOperation();  
  20.   
  21.         [WebMethod]  
  22.         public string HelloWorld()  
  23.         {  
  24.             return "Hello World";  
  25.         }  
  26.   
  27.         [WebMethod(Description = "获取所有货物的信息")]  
  28.         public string[] selectAllCargoInfor()  
  29.         {  
  30.             return dbOperation.selectAllCargoInfor().ToArray();  
  31.         }  
  32.   
  33.         [WebMethod(Description = "增加一条货物信息")]  
  34.         public bool insertCargoInfo(string Cname, int Cnum)  
  35.         {  
  36.             return dbOperation.insertCargoInfo(Cname, Cnum);  
  37.         }  
  38.   
  39.         [WebMethod(Description = "删除一条货物信息")]  
  40.         public bool deleteCargoInfo(string Cno)  
  41.         {  
  42.             return dbOperation.deleteCargoInfo(Cno);  
  43.         }  
  44.     }  
  45. }  


10.      运行程序(F5),会自动打开一个浏览器,可以看到如下画面:

Android通过webservice连接SQLServer 详细教程(数据库 服务器

11.  选择相应的功能并传递参数可以实现调试从浏览器中调试程序:

下图选择的是增加一条货物信息

Android通过webservice连接SQLServer 详细教程(数据库 服务器


12.  程序执行的结果:

Android通过webservice连接SQLServer 详细教程(数据库 服务器

13.另,记住这里的端口名,后面android的程序中添入的端口号就是这个:

Android通过webservice连接SQLServer 详细教程(数据库 服务器


客户端(android端)程序设计

程序代码:

1.MainActivity

[java] view plaincopyprint?

  1. 包装 com.bottle.stockmanage;  
  2.   
  3. 导入 java.util.ArrayList;  
  4. 导入 java.util.HashMap;  
  5. 导入 java.util.List;  
  6.   
  7. 导入 android.app.Activity;  
  8. 导入 android.app.Dialog;  
  9. 导入 android.os.Bundle;  
  10. 导入 android.view.Gravity;  
  11. 导入 android.view.View;  
  12. 导入 android.view.View.OnClickListener;  
  13. 导入 android.view.Window;  
  14. 导入 android.view.WindowManager;  
  15. 导入 android.widget.Button;  
  16. 导入 android.widget.EditText;  
  17. 导入 android.widget.ListView;  
  18. 导入 android.widget.SimpleAdapter;  
  19. 导入 android.widget.Toast;  
  20.   
  21. 公开 班级 主要活动扩展 活动{  
  22.   
  23.     私人按钮btn1;  
  24.     私人 按钮 btn2;  
  25.     私人 按钮 btn3;  
  26.     私有 ListView listView;  
  27.     私有 SimpleAdapter 适配器;  
  28.     私有 DBUtil dbUtil;  
  29.   
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         超级.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.   
  35.         btn1 = (按钮) findViewById(R.id.btn_all);  
  36.         btn2 = (按钮) findViewById(R.id.btn_add);  
  37.         btn3 = (按钮) findViewById(R.id.btn_delete);  
  38.         listView = (ListView) findViewById(R.id.listView);  
  39.         dbUtil =  DBUtil();  
  40.           
  41.         btn1.setOnClickListener(new OnClickListener() {  
  42.               
  43.             @Override  
  44.             公开 void onClick(View v) {  
  45.                 hideButton(true);  
  46.                 setListView();  
  47.             }  
  48.         });  
  49.   
  50.         btn2.setOnClickListener(new OnClickListener() {  
  51.               
  52.             @Override  
  53.             公开 void onClick(View v) {  
  54.                 hideButton(true);  
  55.                 setAddDialog();  
  56.             }  
  57.         });  
  58.   
  59.         btn3.setOnClickListener(new OnClickListener() {  
  60.               
  61.             @Override  
  62.             公开 void onClick(View v) {  
  63.                 hideButton(true);  
  64.                 setDeleteDialog();  
  65.             }  
  66.         });  
  67.     }  
  68.   
  69.     /** 
  70.      * 设置弹出删除对话框 
  71.      */  
  72.     私有 void setDeleteDialog() {  
  73.           
  74.         最终 Dialog 对话框 =  Dialog(MainActivity.);  
  75.         dialog.setContentView(R.layout.dialog_delete);  
  76.         dialog.setTitle("输入想要删除的货物的编号");  
  77.         窗口dialogWindow=dialog.getWindow();  
  78.         WindowManager.LayoutParams lp = dialogWindow.getAttributes();  
  79.         dialogWindow.setGravity(Gravity.CENTER);  
  80.         dialogWindow.setAttributes(lp);  
  81.   
  82.         最终 EditText cNoEditText = (EditText) dialog.findViewById(R.id.editText1);  
  83.         按钮 btnConfirm =(按钮)dialog.findViewById(R.id.button1);  
  84.         按钮 btnCancel = (Button) dialog.findViewById(R.id.button2);  
  85.   
  86.         btnConfirm.setOnClickListener(new OnClickListener() {  
  87.   
  88.             @Override  
  89.             公开 void onClick(View v) {  
  90.                 dbUtil.deleteCargoInfo(cNoEditText.getText().toString());  
  91.                 dialog.dismiss();  
  92.                 hideButton(false);  
  93.                 Toast.makeText(MainActivity.this"成功删除数据", Toast.LENGTH_SHORT).show();  
  94.             }  
  95.         });  
  96.   
  97.         btnCancel.setOnClickListener(new OnClickListener() {  
  98.   
  99.             @Override  
  100.             公开 void onClick(View v) {  
  101.                 dialog.dismiss();  
  102.                 hideButton(false);  
  103.             }  
  104.         });  
  105.           
  106.         dialog.show();  
  107.     }  
  108.   
  109.     /** 
  110.      * 设置弹出添加对话框 
  111.      */  
  112.     私有 void setAddDialog() {  
  113.   
  114.         最终 Dialog 对话框 =  Dialog(MainActivity.);  
  115.         dialog.setContentView(R.layout.dialog_add);  
  116.         dialog.setTitle("输入添加商品的信息");  
  117.         窗口dialogWindow=dialog.getWindow();  
  118.         WindowManager.LayoutParams lp = dialogWindow.getAttributes();  
  119.         dialogWindow.setGravity(Gravity.CENTER);  
  120.         dialogWindow.setAttributes(lp);  
  121.   
  122.         最终 EditText cNameEditText = (EditText) dialog.findViewById(R.id.editText1);  
  123.         最终 EditText cNumEditText = (EditText) dialog.findViewById(R.id.editText2);  
  124.         按钮 btnConfirm =(按钮)dialog.findViewById(R.id.button1);  
  125.         按钮 btnCancel = (Button) dialog.findViewById(R.id.button2);  
  126.   
  127.         btnConfirm.setOnClickListener(new OnClickListener() {  
  128.   
  129.             @Override  
  130.             公开 void onClick(View v) {  
  131.                   
  132.                 dbUtil.insertCargoInfo(cNameEditText.getText().toString(), cNumEditText.getText().toString());  
  133.                 dialog.dismiss();  
  134.                 hideButton(false);  
  135.                 Toast.makeText(MainActivity.this"成功添加数据", Toast.LENGTH_SHORT).show();  
  136.             }  
  137.         });  
  138.   
  139.         btnCancel.setOnClickListener(new OnClickListener() {  
  140.   
  141.             @Override  
  142.             公开 void onClick(View v) {  
  143.                 dialog.dismiss();  
  144.                 hideButton(false);  
  145.             }  
  146.         });  
  147.         dialog.show();  
  148.     }  
  149.   
  150.     /** 
  151.      * 设置listView 
  152.      */  
  153.     私有 void setListView() {  
  154.   
  155.         listView.setVisibility(View.VISIBLE);  
  156.   
  157.         List>> 列表 = new ArrayList>();  
  158.   
  159.         list = dbUtil.getAllInfo();  
  160.   
  161.         适配器=  SimpleAdapter(  
  162.                 MainActivity。这个,   
  163.                 列表,   
  164.                 R.layout.adapter_item,   
  165.                  字符串[] { "Cno""Cname""Cnum" },   
  166.                  int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });  
  167.   
  168.         listView.setAdapter(适配器);  
  169.   
  170.     }  
  171.   
  172.     /** 
  173.      * 设置button的可见性 
  174.      */  
  175.     私有 void hideButton(boolean 结果) {  
  176.         如果 (结果) {  
  177.             btn1.setVisibility(View.GONE);  
  178.             btn2.setVisibility(View.GONE);  
  179.             btn3.setVisibility(View.GONE);  
  180.         } 其他 {  
  181.             btn1.setVisibility(View.VISIBLE);  
  182.             btn2.setVisibility(View.VISIBLE);  
  183.             btn3.setVisibility(View.VISIBLE);  
  184.         }  
  185.   
  186.     }  
  187.   
  188.     /** 
  189.      * 返回按钮的重写 
  190.      */  
  191.     @Override  
  192.     公共 void onBackPressed()  
  193.     {  
  194.         if (listView.getVisibility() == View.VISIBLE) {  
  195.             listView.setVisibility(View.GONE);  
  196.             hideButton(false);  
  197.         }其他 {  
  198.             MainActivity。这个.finish();  
  199.         }  
  200.     }  
  201. }  

2.HttpConnSoap

(改类已经过时,更多请参照

http://blog.csdn.net/zhyl8157121/article/details/8709048)

[java] 查看 普通复印?

  1. 包装 com.bottle.stockmanage;  
  2.   
  3. 导入 java.io.IOException;  
  4. 导入 java.io.InputStream;  
  5. 导入 java.io.OutputStream;  
  6. 导入 java.net.HttpURLConnection;  
  7. 导入 java.net.URL;  
  8. 导入 java.util.ArrayList;  
  9.   
  10. 公共  HttpConnSoap {  
  11.     public ArrayList; GetWebServre(String 方法名称, ArrayList 参数, ArrayList ParValues) {  
  12.         ArrayList; 值 = new ArrayList();  
  13.           
  14.         //ServerUrl是指web服务的url  
  15.         //10.0.2.2是让android模拟器访问本地(PC)服务器,不能写成127.0.0.1  
  16.         //11125是指端口号,即挂载到IIS上的时候开启的端口  
  17.         //Service1.asmx是指提供服务的页面  
  18.         String ServerUrl = "http://10.0.2.2:11125/Service1.asmx";  
  19.           
  20.         //String soapAction="http://tempuri.org/LongUserId1";  
  21.         String soapAction = "http://tempuri.org/" + 方法名称;  
  22.         //字符串数据 = "";  
  23.         字符串肥皂= ""  
  24.                 + ""  
  25.                 + “<肥皂:身体/>”;  
  26.         字符串 tps、vps、ts;  
  27.         字符串 mreakString = "";  
  28.   
  29.         mreakString = " + 方法名称 + " xmlns="http://tempuri.org/">";  
  30.         for (int i = 0; i 
  31.             tps = Parameters.get(i).toString();  
  32.             //设置该方法的参数为.net webService中的参数名称  
  33.             vps = ParValues.get(i).toString();  
  34.             ts = "<" + tps + ">" + vps + " + tps + ">";  
  35.             mreakString = mreakString + ts;  
  36.         }  
  37.         mreakString = mreakString + " + methodName + ">";  
  38.         /* 
  39.         +"" 
  40.         +"string11661" 
  41.         +"string111" 
  42.         + "" 
  43.         */  
  44.         String soap2 = "";  
  45.         String requestData = soap + mreakString + soap2;  
  46.         //System.out.println(requestData);  
  47.   
  48.         try {  
  49.            &nb
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn