您好,欢迎来到欧得旅游网。
搜索
您的当前位置:首页Android通过webservice连接SQLServer详细教程(数据库+服务器+

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

来源:欧得旅游网

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

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


    向表中输入内容

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

    服务器端程序设计(Webservice)

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

    两者的区别:

  • Web Service 只提供程序和接口,不提供用户界面
  • Web Site 提供程序和接口,也提供用户界面(网页)
  • 由于咱们只是需要一个中介来访问sqlserver,所以写成webservice足够了。

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


    1. 新建一个Webservice工程


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


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


    4. 选择Microsoft Sqlserver


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


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


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


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

    [csharp] view plaincopyprint?

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


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

    [csharp] view plaincopyprint?

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



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


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

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



    12. 程序执行的结果:


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



    客户端(android端)程序设计

    程序代码:

    1.MainActivity

    [java] view plaincopyprint?

    1. package com.bottle.stockmanage;
    2. import java.util.ArrayList;
    3. import java.util.HashMap;
    4. import java.util.List;
    5. import android.app.Activity;
    6. import android.app.Dialog;
    7. import android.os.Bundle;
    8. import android.view.Gravity;
    9. import android.view.View;
    10. import android.view.View.OnClickListener;
    11. import android.view.Window;
    12. import android.view.WindowManager;
    13. import android.widget.Button;
    14. import android.widget.EditText;
    15. import android.widget.ListView;
    16. import android.widget.SimpleAdapter;
    17. import android.widget.Toast;
    18. public class MainActivity extends Activity{
    19. private Button btn1;
    20. private Button btn2;
    21. private Button btn3;
    22. private ListView listView;
    23. private SimpleAdapter adapter;
    24. private DBUtil dbUtil;
    25. @Override
    26. public void onCreate(Bundle savedInstanceState) {
    27. super.onCreate(savedInstanceState);
    28. setContentView(R.layout.activity_main);
    29. btn1 = (Button) findViewById(R.id.btn_all);
    30. btn2 = (Button) findViewById(R.id.btn_add);
    31. btn3 = (Button) findViewById(R.id.btn_delete);
    32. listView = (ListView) findViewById(R.id.listView);
    33. dbUtil = new DBUtil();
    34. btn1.setOnClickListener(new OnClickListener() {
    35. @Override
    36. public void onClick(View v) {
    37. hideButton(true);
    38. setListView();
    39. }
    40. });
    41. btn2.setOnClickListener(new OnClickListener() {
    42. @Override
    43. public void onClick(View v) {
    44. hideButton(true);
    45. setAddDialog();
    46. }
    47. });
    48. btn3.setOnClickListener(new OnClickListener() {
    49. @Override
    50. public void onClick(View v) {
    51. hideButton(true);
    52. setDeleteDialog();
    53. }
    54. });
    55. }
    56. /**
    57. * 设置弹出删除对话框
    58. */
    59. private void setDeleteDialog() {
    60. final Dialog dialog = new Dialog(MainActivity.this);
    61. dialog.setContentView(R.layout.dialog_delete);
    62. dialog.setTitle("输入想要删除的货物的编号");
    63. Window dialogWindow = dialog.getWindow();
    64. WindowManager.LayoutParams lp = dialogWindow.getAttributes();
    65. dialogWindow.setGravity(Gravity.CENTER);
    66. dialogWindow.setAttributes(lp);
    67. final EditText cNoEditText = (EditText) dialog.findViewById(R.id.editText1);
    68. Button btnConfirm = (Button) dialog.findViewById(R.id.button1);
    69. Button btnCancel = (Button) dialog.findViewById(R.id.button2);
    70. btnConfirm.setOnClickListener(new OnClickListener() {
    71. @Override
    72. public void onClick(View v) {
    73. dbUtil.deleteCargoInfo(cNoEditText.getText().toString());
    74. dialog.dismiss();
    75. hideButton(false);
    76. Toast.makeText(MainActivity.this, "成功删除数据", Toast.LENGTH_SHORT).show();
    77. }
    78. });
    79. btnCancel.setOnClickListener(new OnClickListener() {
    80. @Override
    81. public void onClick(View v) {
    82. dialog.dismiss();
    83. hideButton(false);
    84. }
    85. });
    86. dialog.show();
    87. }
    88. /**
    89. * 设置弹出添加对话框
    90. */
    91. private void setAddDialog() {
    92. final Dialog dialog = new Dialog(MainActivity.this);
    93. dialog.setContentView(R.layout.dialog_add);
    94. dialog.setTitle("输入添加的货物的信息");
    95. Window dialogWindow = dialog.getWindow();
    96. WindowManager.LayoutParams lp = dialogWindow.getAttributes();
    97. dialogWindow.setGravity(Gravity.CENTER);
    98. dialogWindow.setAttributes(lp);
    99. final EditText cNameEditText = (EditText) dialog.findViewById(R.id.editText1);
    100. final EditText cNumEditText = (EditText) dialog.findViewById(R.id.editText2);
    101. Button btnConfirm = (Button) dialog.findViewById(R.id.button1);
    102. Button btnCancel = (Button) dialog.findViewById(R.id.button2);
    103. btnConfirm.setOnClickListener(new OnClickListener() {
    104. @Override
    105. public void onClick(View v) {
    106. dbUtil.insertCargoInfo(cNameEditText.getText().toString(), cNumEditText.getText().toString());
    107. dialog.dismiss();
    108. hideButton(false);
    109. Toast.makeText(MainActivity.this, "成功添加数据", Toast.LENGTH_SHORT).show();
    110. }
    111. });
    112. btnCancel.setOnClickListener(new OnClickListener() {
    113. @Override
    114. public void onClick(View v) {
    115. dialog.dismiss();
    116. hideButton(false);
    117. }
    118. });
    119. dialog.show();
    120. }
    121. /**
    122. * 设置listView
    123. */
    124. private void setListView() {
    125. listView.setVisibility(View.VISIBLE);
    126. List> list = new ArrayList>();
    127. list = dbUtil.getAllInfo();
    128. adapter = new SimpleAdapter(
    129. MainActivity.this,
    130. list,
    131. R.layout.adapter_item,
    132. new String[] { "Cno", "Cname", "Cnum" },
    133. new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });
    134. listView.setAdapter(adapter);
    135. }
    136. /**
    137. * 设置button的可见性
    138. */
    139. private void hideButton(boolean result) {
    140. if (result) {
    141. btn1.setVisibility(View.GONE);
    142. btn2.setVisibility(View.GONE);
    143. btn3.setVisibility(View.GONE);
    144. } else {
    145. btn1.setVisibility(View.VISIBLE);
    146. btn2.setVisibility(View.VISIBLE);
    147. btn3.setVisibility(View.VISIBLE);
    148. }
    149. }
    150. /**
    151. * 返回按钮的重写
    152. */
    153. @Override
    154. public void onBackPressed()
    155. {
    156. if (listView.getVisibility() == View.VISIBLE) {
    157. listView.setVisibility(View.GONE);
    158. hideButton(false);
    159. }else {
    160. MainActivity.this.finish();
    161. }
    162. }
    163. }


    2.HttpConnSoap

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

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

    [java] view plaincopyprint?

    1. package com.bottle.stockmanage;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.io.OutputStream;
    5. import java.net.HttpURLConnection;
    6. import java.net.URL;
    7. import java.util.ArrayList;
    8. public class HttpConnSoap {
    9. public ArrayList GetWebServre(String methodName, ArrayList Parameters, ArrayList ParValues) {
    10. ArrayList Values = new ArrayList();
    11. //ServerUrl是指webservice的url
    12. //10.0.2.2是让android模拟器访问本地(PC)服务器,不能写成127.0.0.1
    13. //11125是指端口号,即挂载到IIS上的时候开启的端口
    14. //Service1.asmx是指提供服务的页面
    15. String ServerUrl = "http://10.0.2.2:11125/Service1.asmx";
    16. //String soapAction="http://tempuri.org/LongUserId1";
    17. String soapAction = "http://tempuri.org/" + methodName;
    18. //String data = "";
    19. String soap = ""
    20. + ""
    21. + "";
    22. String tps, vps, ts;
    23. String mreakString = "";
    24. mreakString = "<" + methodName + " xmlns=\"http://tempuri.org/\">";
    25. for (int i = 0; i < Parameters.size(); i++) {
    26. tps = Parameters.get(i).toString();
    27. //设置该方法的参数为.net webService中的参数名称
    28. vps = ParValues.get(i).toString();
    29. ts = "<" + tps + ">" + vps + "";
    30. mreakString = mreakString + ts;
    31. }
    32. mreakString = mreakString + "";
    33. /*
    34. +""
    35. +"string11661"
    36. +"string111"
    37. + ""
    38. */
    39. String soap2 = "";
    40. String requestData = soap + mreakString + soap2;
    41. //System.out.println(requestData);
    42. try {
    43. &nb

    Copyright © 2019- ovod.cn 版权所有

    违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

    本站由北京市万商天勤律师事务所王兴未律师提供法律服务