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,代码如下:

  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. /// <summary>
  19. /// 一个操作数据库的类,所有对SQLServer的操作都写在这个类中,使用的时候实例化一个然后直接调用就可以
  20. /// </summary>
  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. /// <summary>
  46. /// 获取所有货物的信息
  47. /// </summary>
  48. /// <returns>所有货物信息</returns>
  49. public List<string> selectAllCargoInfor()
  50. {
  51. List<string> list = new List<string>();
  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. /// <summary>
  73. /// 增加一条货物信息
  74. /// </summary>
  75. /// <param name="Cname">货物名称</param>
  76. /// <param name="Cnum">货物数量</param>
  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. /// <summary>
  93. /// 删除一条货物信息
  94. /// </summary>
  95. /// <param name="Cno">货物编号</param>
  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代码如下:

  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. /// <summary>
  9. /// Service1 的摘要说明
  10. /// </summary>
  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

  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<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
  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)

  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<String> GetWebServre(String methodName, ArrayList<String> Parameters, ArrayList<String> ParValues) {
  10. ArrayList<String> Values = new ArrayList<String>();
  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 = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
  20. + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
  21. + "<soap:Body />";
  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 + "</" + tps + ">";
  30. mreakString = mreakString + ts;
  31. }
  32. mreakString = mreakString + "</" + methodName + ">";
  33. /*
  34. +"<HelloWorld xmlns=\"http://tempuri.org/\">"
  35. +"<x>string11661</x>"
  36. +"<SF1>string111</SF1>"
  37. + "</HelloWorld>"
  38. */
  39. String soap2 = "</soap:Envelope>";
  40. String requestData = soap + mreakString + soap2;
  41. //System.out.println(requestData);
  42. try {
  43. URL url = new URL(ServerUrl);
  44. HttpURLConnection con = (HttpURLConnection) url.openConnection();
  45. byte[] bytes = requestData.getBytes("utf-8");
  46. con.setDoInput(true);
  47. con.setDoOutput(true);
  48. con.setUseCaches(false);
  49. con.setConnectTimeout(6000);// 设置超时时间
  50. con.setRequestMethod("POST");
  51. con.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
  52. con.setRequestProperty("SOAPAction", soapAction);
  53. con.setRequestProperty("Content-Length", "" + bytes.length);
  54. OutputStream outStream = con.getOutputStream();
  55. outStream.write(bytes);
  56. outStream.flush();
  57. outStream.close();
  58. InputStream inStream = con.getInputStream();
  59. //data=parser(inStream);
  60. //System.out.print("11");
  61. Values = inputStreamtovaluelist(inStream, methodName);
  62. //System.out.println(Values.size());
  63. return Values;
  64. } catch (Exception e) {
  65. System.out.print("2221");
  66. return null;
  67. }
  68. }
  69. public ArrayList<String> inputStreamtovaluelist(InputStream in, String MonthsName) throws IOException {
  70. StringBuffer out = new StringBuffer();
  71. String s1 = "";
  72. byte[] b = new byte[4096];
  73. ArrayList<String> Values = new ArrayList<String>();
  74. Values.clear();
  75. for (int n; (n = in.read(b)) != -1;) {
  76. s1 = new String(b, 0, n);
  77. out.append(s1);
  78. }
  79. System.out.println(out);
  80. String[] s13 = s1.split("><");
  81. String ifString = MonthsName + "Result";
  82. String TS = "";
  83. String vs = "";
  84. Boolean getValueBoolean = false;
  85. for (int i = 0; i < s13.length; i++) {
  86. TS = s13[i];
  87. System.out.println(TS);
  88. int j, k, l;
  89. j = TS.indexOf(ifString);
  90. k = TS.lastIndexOf(ifString);
  91. if (j >= 0) {
  92. System.out.println(j);
  93. if (getValueBoolean == false) {
  94. getValueBoolean = true;
  95. } else {
  96. }
  97. if ((j >= 0) && (k > j)) {
  98. System.out.println("FFF" + TS.lastIndexOf("/" + ifString));
  99. //System.out.println(TS);
  100. l = ifString.length() + 1;
  101. vs = TS.substring(j + l, k - 2);
  102. //System.out.println("fff"+vs);
  103. Values.add(vs);
  104. System.out.println("退出" + vs);
  105. getValueBoolean = false;
  106. return Values;
  107. }
  108. }
  109. if (TS.lastIndexOf("/" + ifString) >= 0) {
  110. getValueBoolean = false;
  111. return Values;
  112. }
  113. if ((getValueBoolean) && (TS.lastIndexOf("/" + ifString) < 0) && (j < 0)) {
  114. k = TS.length();
  115. //System.out.println(TS);
  116. vs = TS.substring(7, k - 8);
  117. //System.out.println("f"+vs);
  118. Values.add(vs);
  119. }
  120. }
  121. return Values;
  122. }
  123. }

3.DBUtil

  1. package com.bottle.stockmanage;
  2. import java.sql.Connection;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. public class DBUtil {
  7. private ArrayList<String> arrayList = new ArrayList<String>();
  8. private ArrayList<String> brrayList = new ArrayList<String>();
  9. private ArrayList<String> crrayList = new ArrayList<String>();
  10. private HttpConnSoap Soap = new HttpConnSoap();
  11. public static Connection getConnection() {
  12. Connection con = null;
  13. try {
  14. //Class.forName("org.gjt.mm.mysql.Driver");
  15. //con=DriverManager.getConnection("jdbc:mysql://192.168.0.106:3306/test?useUnicode=true&characterEncoding=UTF-8","root","initial");
  16. } catch (Exception e) {
  17. //e.printStackTrace();
  18. }
  19. return con;
  20. }
  21. /**
  22. * 获取所有货物的信息
  23. *
  24. * @return
  25. */
  26. public List<HashMap<String, String>> getAllInfo() {
  27. List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
  28. arrayList.clear();
  29. brrayList.clear();
  30. crrayList.clear();
  31. crrayList = Soap.GetWebServre("selectAllCargoInfor", arrayList, brrayList);
  32. HashMap<String, String> tempHash = new HashMap<String, String>();
  33. tempHash.put("Cno", "Cno");
  34. tempHash.put("Cname", "Cname");
  35. tempHash.put("Cnum", "Cnum");
  36. list.add(tempHash);
  37. for (int j = 0; j < crrayList.size(); j += 3) {
  38. HashMap<String, String> hashMap = new HashMap<String, String>();
  39. hashMap.put("Cno", crrayList.get(j));
  40. hashMap.put("Cname", crrayList.get(j + 1));
  41. hashMap.put("Cnum", crrayList.get(j + 2));
  42. list.add(hashMap);
  43. }
  44. return list;
  45. }
  46. /**
  47. * 增加一条货物信息
  48. *
  49. * @return
  50. */
  51. public void insertCargoInfo(String Cname, String Cnum) {
  52. arrayList.clear();
  53. brrayList.clear();
  54. arrayList.add("Cname");
  55. arrayList.add("Cnum");
  56. brrayList.add(Cname);
  57. brrayList.add(Cnum);
  58. Soap.GetWebServre("insertCargoInfo", arrayList, brrayList);
  59. }
  60. /**
  61. * 删除一条货物信息
  62. *
  63. * @return
  64. */
  65. public void deleteCargoInfo(String Cno) {
  66. arrayList.clear();
  67. brrayList.clear();
  68. arrayList.add("Cno");
  69. brrayList.add(Cno);
  70. Soap.GetWebServre("deleteCargoInfo", arrayList, brrayList);
  71. }
  72. }

4.activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent" >
  5. <ListView
  6. android:id="@+id/listView"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"
  9. android:visibility="gone" >
  10. </ListView>
  11. <Button
  12. android:id="@+id/btn_all"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_above="@+id/btn_add"
  16. android:layout_alignLeft="@+id/btn_add"
  17. android:layout_marginBottom="10dip"
  18. android:text="@string/btn1" />
  19. <Button
  20. android:id="@+id/btn_add"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_centerHorizontal="true"
  24. android:layout_centerVertical="true"
  25. android:text="@string/btn2" />
  26. <Button
  27. android:id="@+id/btn_delete"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_alignLeft="@+id/btn_add"
  31. android:layout_below="@+id/btn_add"
  32. android:layout_marginTop="10dip"
  33. android:text="@string/btn3" />
  34. </RelativeLayout>

5.adapter_item.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:descendantFocusability="blocksDescendants"
  6. android:gravity="center" >
  7. <TableRow
  8. android:id="@+id/classroom_detail_item_tableRow"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:gravity="center" >
  12. <TextView
  13. android:id="@+id/txt_Cno"
  14. android:layout_width="80dp"
  15. android:layout_height="wrap_content"
  16. android:gravity="center"
  17. android:height="40dp"
  18. android:textSize="14sp" >
  19. </TextView>
  20. <TextView
  21. android:id="@+id/txt_Cname"
  22. android:layout_width="80dp"
  23. android:layout_height="wrap_content"
  24. android:gravity="center"
  25. android:height="40dp"
  26. android:textSize="14sp" >
  27. </TextView>
  28. <TextView
  29. android:id="@+id/txt_Cnum"
  30. android:layout_width="80dp"
  31. android:layout_height="wrap_content"
  32. android:gravity="center"
  33. android:height="40dp"
  34. android:textSize="14sp" >
  35. </TextView>
  36. </TableRow>
  37. </TableLayout>

6.dialog_add.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <EditText
  7. android:id="@+id/editText1"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:ems="10"
  11. android:hint="@string/add_hint1" >
  12. <requestFocus />
  13. </EditText>
  14. <EditText
  15. android:id="@+id/editText2"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:ems="10"
  19. android:hint="@string/add_hint2"
  20. android:inputType="number" />
  21. <LinearLayout
  22. android:layout_width="fill_parent"
  23. android:layout_height="wrap_content"
  24. android:orientation="horizontal" >
  25. <Button
  26. android:id="@+id/button1"
  27. android:layout_width="100dip"
  28. android:layout_height="wrap_content"
  29. android:layout_marginLeft="20dip"
  30. android:text="@string/confirm" />
  31. <Button
  32. android:id="@+id/button2"
  33. android:layout_width="100dip"
  34. android:layout_height="wrap_content"
  35. android:layout_marginLeft="40dip"
  36. android:text="@string/cancel" />
  37. </LinearLayout>
  38. </LinearLayout>

7.dialog_delete.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <EditText
  7. android:id="@+id/editText1"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:ems="10"
  11. android:hint="@string/delete_hint" >
  12. <requestFocus />
  13. </EditText>
  14. <LinearLayout
  15. android:layout_width="fill_parent"
  16. android:layout_height="wrap_content"
  17. android:orientation="horizontal" >
  18. <Button
  19. android:id="@+id/button1"
  20. android:layout_width="100dip"
  21. android:layout_height="wrap_content"
  22. android:layout_marginLeft="20dip"
  23. android:text="@string/confirm" />
  24. <Button
  25. android:id="@+id/button2"
  26. android:layout_width="100dip"
  27. android:layout_height="wrap_content"
  28. android:layout_marginLeft="40dip"
  29. android:text="@string/cancel" />
  30. </LinearLayout>
  31. </LinearLayout>

8.strings.xml

  1. <resources>
  2. <string name="app_name">StockManagement</string>
  3. <string name="menu_settings">Settings</string>
  4. <string name="title_activity_main">MainActivity</string>
  5. <string name="btn1">查看所有货物信息</string>
  6. <string name="btn2">增加一条货物信息</string>
  7. <string name="btn3">删除一条货物信息</string>
  8. <string name="add_hint1">输入添加的货物的名称</string>
  9. <string name="add_hint2">输入货物的数量</string>
  10. <string name="confirm">确定</string>
  11. <string name="cancel">取消</string>
  12. <string name="delete_hint">输入删除的货物的编号</string>
  13. </resources>

9.Manifest.xml

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.bottle.stockmanage"
  3. android:versionCode="1"
  4. android:versionName="1.0" >
  5. <uses-sdk
  6. android:minSdkVersion="7"
  7. android:targetSdkVersion="15" />
  8. <uses-permission android:name="android.permission.INTERNET" />
  9. <application
  10. android:icon="@drawable/ic_launcher"
  11. android:label="@string/app_name"
  12. android:theme="@android:style/Theme.NoTitleBar" >
  13. <activity
  14. android:name=".MainActivity"
  15. android:label="@string/title_activity_main"
  16. android:screenOrientation="portrait" >
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN" />
  19. <category android:name="android.intent.category.LAUNCHER" />
  20. </intent-filter>
  21. </activity>
  22. </application>
  23. </manifest>

运行程序的效果如下图所示:

再说一下IIS,如果只是在本地进行测试等操作,是不需要使用到IIS的,但是如果想发布出去,就要配置一下IIS。

好啦,基本就是这样了。程序不是完善的,但大概的思路就是这样,用到的技术也大概就是这几样,但是每一样拿出来都够学一阵的了。

--->2012.12.02 增加内容

附上本文demo的CSDN下载地址

http://download.csdn.net/detail/zhyl8157121/4836107

--->2013.01.08 增加内容

解释一下android端如何和webservice通信的。(如何修改实例程序)

具体的更深层的东西已经在HttpSoap中封装好了,所以大家使用的时候可以直接用这个类就可以了。(我也不懂是怎么实现的……)

android调用的方法就是如DBUtil中那样,比如

其中arrayList中和brrayList中分别存放对应的webservice中“selectAllCargoInfor”方法的参数名和参数的值。

由于webservice中的selectAllCargoInfo方法的参数为空,所以对应的,android端调用的时候,arrayList和brrayList的值就是空的。

所以大家在使用的时候,只需要将webservice中的方法写好,然后写好DBUtil中的调用参数即可。

.23 增加内容

如果获取值为空,可能是返回值是复杂类型造成的,可以参考:http://blog.csdn.net/zhyl8157121/article/details/8709048

谢谢支持,欢迎大家批评指正。

Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)的更多相关文章

  1. Android连接SQLServer详细教程(数据库+服务器+客户端)

    摘星 标签: android连接sql http://blog.csdn.net/haoxingfeng/article/details/9111105

  2. 使用Express连接mysql详细教程(附项目的完整代码我放在结尾了)

    使用Express连接mysql详细教程(附项目的完整代码我放在结尾了) 要使用Express连接本地数据库 我们首先需要安装好Express的依赖 我们使用这个框架呢首先要有一点ajax的基础 如果 ...

  3. Eclipse开发Android项目报错解决方案详细教程,最新版一篇就够了!

    本文记录刚接触Android开发搭建环境后新建工程各种可能的报错,并亲身经历漫长的解决过程(╥╯^╰╥),寻找各种偏方,避免大家采坑,希望能帮助到大家. 报错信息 出错一:The import and ...

  4. Android通过webservice对sqlserver数据库进行操作

    首页在AndroidManifest.xml中添加访问数据库权限 <uses-sdk android:minSdkVersion="7" /> <uses-per ...

  5. Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端)

    写在最前: 在实际开发中,相信每个项目都会有用户登陆注册功能,这个实现的方法很多,下面是我实现的方法,供大家交流. 新人发帖,万分紧张,怎么样才能装作一副经常发帖的样子不被别人看出来呢-,- ? 好了 ...

  6. Navicat连接Oracle详细教程

    Navicat Premium算是比较好的一个可视化数据库管理工具了,短小精悍,一个工具解决三种数据库的连接问题,真正做到了集成管理,对MySQL,SQLServer而言,连接比较简单,就不赘述了,现 ...

  7. 看完小白也会使用,Android投屏神器scrcpy详细教程

    楔子 做为一个软件测试工程师,在使用手机测试的时候,缺陷附件想附上截图.视频,需要从手机把图片.视频发送到拷贝或发送到电脑,非常麻烦. 所以想到使用投屏软件,把手机的屏幕投屏到电脑,便可以直接在电脑上 ...

  8. Android安卓开发环境搭建详细教程

    安装目录:步骤1 安装JDK步骤2 安装 Android SDK ----http://www.androiddevtools.cn/ 步骤3 安装Tomcat步骤4 安装Ant步骤5 安装Eclip ...

  9. thinkphp3.2.3连接sqlserver 2008 R2 数据库

    环境: 操作系统——win7 64位旗舰版 PHP——thinkphp 3.23 数据库——Microsoft SQL Server 2008 R2 需要用到的软件: 步骤: 1.搜索SQLSRV30 ...

随机推荐

  1. Android开发--TableLayout的应用

    1.简介 TableLayout为表格框架结构

  2. centos mongodb cluster install 完全版

    分享一则用yum安装的mongodb初始化脚本. install_mongodb.sh会安装mongodb所需的基本环境. 配置副本集的时候会需要辅助文件hosts.conf. 说明:该示例为一主一丛 ...

  3. ubuntu下各种压缩包的解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

  4. git clone error: RPC failed; result=22, HTTP code = 502

    http://www.jianshu.com/p/645d3fe4e028 git克隆的工程太大用https的方式会有如下问题 hbl:tmp hubert$ git clone https://gi ...

  5. 关于js异步上传文件

    好久没登录博客园了,今天来一发分享. 最近项目里有个需求,上传文件(好吧,这种需求很常见,这也不是第一次遇到了).当时第一想法就是直接用form表单提交(原谅我以前就是这么干的),不过表单里不仅有文件 ...

  6. 使用面向 iOS 的本机插件扩展 PhoneGap

    本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneGap(也称为 Apache Cordova)应用程序本机插件.如果您刚开始接触 PhoneGap 或者需要回顾 PhoneGap ...

  7. SCSS

    CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作. 通俗的说,“CSS ...

  8. iOS开发——加载、滑动翻阅大量图片解决方案详解

    加载.滑动翻阅大量图片解决方案详解     今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清 ...

  9. eclipse 高亮代码

    本文整合自网络上的两种靠谱的使eclipse代码高亮的方式. 其实你可以在Window->proferences->java->editor->syndex coloring- ...

  10. CentOS 7 64位的安装流程

    若出现以下不支持虚拟机的问题: 表示虚拟机检测到CPU支不支持虚拟化,要去BIOS里设置虚拟化技术设置为enabled:重启电脑-按"F1或Fn+F1"-进入BIOS主界面-移至S ...