视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Android通过webservice连接SQLServer详细教程(数据库+服务器+
2020-11-09 15:46:40 责编:小采
文档


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的功能。

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

    开发环境的部署

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

    操作系统:Windows7bit 旗舰版

    当然这个是什么基本无所谓,只是我是在这上面开发的,不过家庭普通版的貌似不能配置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

      下载本文
    显示全文
    专题