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?
- using System;
- using System.Data;
- using System.Configuration;
- using System.Linq;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Xml.Linq;
- using System.Data.SqlClient;
- using System.Text.RegularExpressions;
- using System.Collections;
- using System.Collections.Generic;
- namespace StockManageWebservice
- {
-
///
- /// 一个操作数据库的类,所有对SQLServer的操作都写在这个类中,使用的时候实例化一个然后直接调用就可以
- ///
- public class DBOperation:IDisposable
- {
- public static SqlConnection sqlCon; //用于连接数据库
- //将下面的引号之间的内容换成上面记录下的属性中的连接字符串
- private String ConServerStr = @"Data Source=BOTTLE-PC;Initial Catalog=StockManage;Integrated Security=True";
- //默认构造函数
- public DBOperation()
- {
- if (sqlCon == null)
- {
- sqlCon = new SqlConnection();
- sqlCon.ConnectionString = ConServerStr;
- sqlCon.Open();
- }
- }
- //关闭/销毁函数,相当于Close()
- public void Dispose()
- {
- if (sqlCon != null)
- {
- sqlCon.Close();
- sqlCon = null;
- }
- }
-
///
- /// 获取所有货物的信息
- ///
-
///
所有货物信息 - public Liststring> selectAllCargoInfor()
- {
- Liststring> list = new Liststring>();
- try
- {
- string sql = "select * from C";
- SqlCommand cmd = new SqlCommand(sql,sqlCon);
- SqlDataReader reader = cmd.ExecuteReader();
- while (reader.Read())
- {
- //将结果集信息添加到返回向量中
- list.Add(reader[0].ToString());
- list.Add(reader[1].ToString());
- list.Add(reader[2].ToString());
- }
- reader.Close();
- cmd.Dispose();
- }
- catch(Exception)
- {
- }
- return list;
- }
-
///
- /// 增加一条货物信息
- ///
- /// 货物名称
- /// 货物数量
- public bool insertCargoInfo(string Cname, int Cnum)
- {
- try
- {
- string sql = "insert into C (Cname,Cnum) values ('" + Cname + "'," + Cnum + ")";
- SqlCommand cmd = new SqlCommand(sql, sqlCon);
- cmd.ExecuteNonQuery();
- cmd.Dispose();
- return true;
- }
- catch (Exception)
- {
- return false;
- }
- }
-
///
- /// 删除一条货物信息
- ///
- /// 货物编号
- public bool deleteCargoInfo(string Cno)
- {
- try
- {
- string sql = "delete from C where Cno=" + Cno;
- SqlCommand cmd = new SqlCommand(sql, sqlCon);
- cmd.ExecuteNonQuery();
- cmd.Dispose();
- return true;
- }
- catch (Exception)
- {
- return false;
- }
- }
- }
- }
9. 修改Service1.asmx.cs代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Services;
- namespace StockManageWebservice
- {
-
///
- /// Service1 的摘要说明
- ///
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- [System.ComponentModel.ToolboxItem(false)]
- // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
- // [System.Web.Script.Services.ScriptService]
- public class Service1 : System.Web.Services.WebService
- {
- DBOperation dbOperation = new DBOperation();
- [WebMethod]
- public string HelloWorld()
- {
- return "Hello World";
- }
- [WebMethod(Description = "获取所有货物的信息")]
- public string[] selectAllCargoInfor()
- {
- return dbOperation.selectAllCargoInfor().ToArray();
- }
- [WebMethod(Description = "增加一条货物信息")]
- public bool insertCargoInfo(string Cname, int Cnum)
- {
- return dbOperation.insertCargoInfo(Cname, Cnum);
- }
- [WebMethod(Description = "删除一条货物信息")]
- public bool deleteCargoInfo(string Cno)
- {
- return dbOperation.deleteCargoInfo(Cno);
- }
- }
- }
10. 运行程序(F5),会自动打开一个浏览器,可以看到如下画面:
11. 选择相应的功能并传递参数可以实现调试从浏览器中调试程序:
下图选择的是增加一条货物信息
12. 程序执行的结果:
13.另,记住这里的端口名,后面android的程序中添入的端口号就是这个:
客户端(android端)程序设计
程序代码:
1.MainActivity
[java] view plaincopyprint?
- package com.bottle.stockmanage;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import android.app.Activity;
- import android.app.Dialog;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import android.widget.Toast;
- public class MainActivity extends Activity{
- private Button btn1;
- private Button btn2;
- private Button btn3;
- private ListView listView;
- private SimpleAdapter adapter;
- private DBUtil dbUtil;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btn1 = (Button) findViewById(R.id.btn_all);
- btn2 = (Button) findViewById(R.id.btn_add);
- btn3 = (Button) findViewById(R.id.btn_delete);
- listView = (ListView) findViewById(R.id.listView);
- dbUtil = new DBUtil();
- btn1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- hideButton(true);
- setListView();
- }
- });
- btn2.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- hideButton(true);
- setAddDialog();
- }
- });
- btn3.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- hideButton(true);
- setDeleteDialog();
- }
- });
- }
- /**
- * 设置弹出删除对话框
- */
- private void setDeleteDialog() {
- final Dialog dialog = new Dialog(MainActivity.this);
- dialog.setContentView(R.layout.dialog_delete);
- dialog.setTitle("输入想要删除的货物的编号");
- Window dialogWindow = dialog.getWindow();
- WindowManager.LayoutParams lp = dialogWindow.getAttributes();
- dialogWindow.setGravity(Gravity.CENTER);
- dialogWindow.setAttributes(lp);
- final EditText cNoEditText = (EditText) dialog.findViewById(R.id.editText1);
- Button btnConfirm = (Button) dialog.findViewById(R.id.button1);
- Button btnCancel = (Button) dialog.findViewById(R.id.button2);
- btnConfirm.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- dbUtil.deleteCargoInfo(cNoEditText.getText().toString());
- dialog.dismiss();
- hideButton(false);
- Toast.makeText(MainActivity.this, "成功删除数据", Toast.LENGTH_SHORT).show();
- }
- });
- btnCancel.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- dialog.dismiss();
- hideButton(false);
- }
- });
- dialog.show();
- }
- /**
- * 设置弹出添加对话框
- */
- private void setAddDialog() {
- final Dialog dialog = new Dialog(MainActivity.this);
- dialog.setContentView(R.layout.dialog_add);
- dialog.setTitle("输入添加的货物的信息");
- Window dialogWindow = dialog.getWindow();
- WindowManager.LayoutParams lp = dialogWindow.getAttributes();
- dialogWindow.setGravity(Gravity.CENTER);
- dialogWindow.setAttributes(lp);
- final EditText cNameEditText = (EditText) dialog.findViewById(R.id.editText1);
- final EditText cNumEditText = (EditText) dialog.findViewById(R.id.editText2);
- Button btnConfirm = (Button) dialog.findViewById(R.id.button1);
- Button btnCancel = (Button) dialog.findViewById(R.id.button2);
- btnConfirm.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- dbUtil.insertCargoInfo(cNameEditText.getText().toString(), cNumEditText.getText().toString());
- dialog.dismiss();
- hideButton(false);
- Toast.makeText(MainActivity.this, "成功添加数据", Toast.LENGTH_SHORT).show();
- }
- });
- btnCancel.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- dialog.dismiss();
- hideButton(false);
- }
- });
- dialog.show();
- }
- /**
- * 设置listView
- */
- private void setListView() {
- listView.setVisibility(View.VISIBLE);
-
List
> list = new ArrayList >(); - list = dbUtil.getAllInfo();
- adapter = new SimpleAdapter(
- MainActivity.this,
- list,
- R.layout.adapter_item,
- new String[] { "Cno", "Cname", "Cnum" },
- new int[] { R.id.txt_Cno, R.id.txt_Cname, R.id.txt_Cnum });
- listView.setAdapter(adapter);
- }
- /**
- * 设置button的可见性
- */
- private void hideButton(boolean result) {
- if (result) {
- btn1.setVisibility(View.GONE);
- btn2.setVisibility(View.GONE);
- btn3.setVisibility(View.GONE);
- } else {
- btn1.setVisibility(View.VISIBLE);
- btn2.setVisibility(View.VISIBLE);
- btn3.setVisibility(View.VISIBLE);
- }
- }
- /**
- * 返回按钮的重写
- */
- @Override
- public void onBackPressed()
- {
- if (listView.getVisibility() == View.VISIBLE) {
- listView.setVisibility(View.GONE);
- hideButton(false);
- }else {
- MainActivity.this.finish();
- }
- }
- }
2.HttpConnSoap
(改类已经过时,更多请参照
http://blog.csdn.net/zhyl8157121/article/details/8709048)
[java] view plaincopyprint?
- package com.bottle.stockmanage;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- public class HttpConnSoap {
-
public ArrayList
GetWebServre(String methodName, ArrayList Parameters, ArrayList ParValues) { -
ArrayList
Values = new ArrayList (); - //ServerUrl是指webservice的url
- //10.0.2.2是让android模拟器访问本地(PC)服务器,不能写成127.0.0.1
- //11125是指端口号,即挂载到IIS上的时候开启的端口
- //Service1.asmx是指提供服务的页面
- String ServerUrl = "http://10.0.2.2:11125/Service1.asmx";
- //String soapAction="http://tempuri.org/LongUserId1";
- String soapAction = "http://tempuri.org/" + methodName;
- //String data = "";
- String soap = ""
-
+ "
" - + "";
- String tps, vps, ts;
- String mreakString = "";
- mreakString = " + methodName + " xmlns=\"http://tempuri.org/\">";
- for (int i = 0; i
- tps = Parameters.get(i).toString();
- //设置该方法的参数为.net webService中的参数名称
- vps = ParValues.get(i).toString();
- ts = " + tps + ">" + vps + "" + tps + ">";
- mreakString = mreakString + ts;
- }
- mreakString = mreakString + "" + methodName + ">";
- /*
-
+"
" -
+"
string11661 " -
+"
string111 " - + ""
- */
- String soap2 = "";
- String requestData = soap + mreakString + soap2;
- //System.out.println(requestData);
- try {
- &nb

根据美国司法部的解释,蓝色警报旨在提供关于可能对执法人员构成直接和紧急威胁的个人的重要信息。这种警报的目的是及时通知公众,并让他们了解与这些罪犯相关的潜在危险。通过这种主动的方式,蓝色警报有助于增强社区的安全意识,促使人们采取必要的预防措施以保护自己和周围的人。这种警报系统的建立旨在提高对潜在威胁的警觉性,并加强执法机构与公众之间的沟通,以共尽管这些紧急通知对我们社会至关重要,但有时可能会对日常生活造成干扰,尤其是在午夜或重要活动时收到通知时。为了确保安全,我们建议您保持这些通知功能开启,但如果

Android中的轮询是一项关键技术,它允许应用程序定期从服务器或数据源检索和更新信息。通过实施轮询,开发人员可以确保实时数据同步并向用户提供最新的内容。它涉及定期向服务器或数据源发送请求并获取最新信息。Android提供了定时器、线程、后台服务等多种机制来高效地完成轮询。这使开发人员能够设计与远程数据源保持同步的响应式动态应用程序。本文探讨了如何在Android中实现轮询。它涵盖了实现此功能所涉及的关键注意事项和步骤。轮询定期检查更新并从服务器或源检索数据的过程在Android中称为轮询。通过

为了提升用户体验并防止数据或进度丢失,Android应用程序开发者必须避免意外退出。他们可以通过加入“再次按返回退出”功能来实现这一点,该功能要求用户在特定时间内连续按两次返回按钮才能退出应用程序。这种实现显著提升了用户参与度和满意度,确保他们不会意外丢失任何重要信息Thisguideexaminesthepracticalstepstoadd"PressBackAgaintoExit"capabilityinAndroid.Itpresentsasystematicguid

1.java复杂类如果有什么地方不懂,请看:JAVA总纲或者构造方法这里贴代码,很简单没有难度。2.smali代码我们要把java代码转为smali代码,可以参考java转smali我们还是分模块来看。2.1第一个模块——信息模块这个模块就是基本信息,说明了类名等,知道就好对分析帮助不大。2.2第二个模块——构造方法我们来一句一句解析,如果有之前解析重复的地方就不再重复了。但是会提供链接。.methodpublicconstructor(Ljava/lang/String;I)V这一句话分为.m

如何将WhatsApp聊天从Android转移到iPhone?你已经拿到了新的iPhone15,并且你正在从Android跳跃?如果是这种情况,您可能还对将WhatsApp从Android转移到iPhone感到好奇。但是,老实说,这有点棘手,因为Android和iPhone的操作系统不兼容。但不要失去希望。这不是什么不可能完成的任务。让我们在本文中讨论几种将WhatsApp从Android转移到iPhone15的方法。因此,坚持到最后以彻底学习解决方案。如何在不删除数据的情况下将WhatsApp

原因:1、安卓系统上设置了一个JAVA虚拟机来支持Java应用程序的运行,而这种虚拟机对硬件的消耗是非常大的;2、手机生产厂商对安卓系统的定制与开发,增加了安卓系统的负担,拖慢其运行速度影响其流畅性;3、应用软件太臃肿,同质化严重,在一定程度上拖慢安卓手机的运行速度。

1.启动ida端口监听1.1启动Android_server服务1.2端口转发1.3软件进入调试模式2.ida下断2.1attach附加进程2.2断三项2.3选择进程2.4打开Modules搜索artPS:小知识Android4.4版本之前系统函数在libdvm.soAndroid5.0之后系统函数在libart.so2.5打开Openmemory()函数在libart.so中搜索Openmemory函数并且跟进去。PS:小知识一般来说,系统dex都会在这个函数中进行加载,但是会出现一个问题,后

1.自动化测试自动化测试主要包括几个部分,UI功能的自动化测试、接口的自动化测试、其他专项的自动化测试。1.1UI功能自动化测试UI功能的自动化测试,也就是大家常说的自动化测试,主要是基于UI界面进行的自动化测试,通过脚本实现UI功能的点击,替代人工进行自动化测试。这个测试的优势在于对高度重复的界面特性功能测试的测试人力进行有效的释放,利用脚本的执行,实现功能的快速高效回归。但这种测试的不足之处也是显而易见的,主要包括维护成本高,易发生误判,兼容性不足等。因为是基于界面操作,界面的稳定程度便成了


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 Chinese version
Chinese version, very easy to use
