本节来讲安卓如何直接连接sql server。在阅读本节之前,您应该先看一下第一讲的文章https://blog.youkuaiyun.com/wstcl/article/details/125081398?spm=1001.2014.3001.5502。开门见山,直接写代码步骤
1.用android studio新建或打开一个安卓项目。
2.引入第三方jar包sqljdbc4.jar、jtds-1.2.7.jar。
3.新建一个包名SqlUtil,用于存放数据库连接类Base代码如下。
public class Base
{
public final static String url="jdbc:jtds:sqlserver://10.0.2.2:1433/dbtest;charset=gbk" ;
public final static String user="sa" ;
public final static String password="123" ;
}
4.新建一个包名Bean,用于存放种子类,Bean中新建一个与数据库表对应的种子类——Product,代码如下:
public class Product
{
public int Id;
public String Name;
public int Num;
}
5.新建一个包名Task,用于各种存放操作数据库各表的任务类,Task中建立一个与数据库表对应任务类——TaskProduct,代码如下
import android.app.Activity;
import android.os.Handler;
import android.util.Log;
import com.example.sqlsrver_dircet.Bean.Product;
import com.example.sqlsrver_dircet.SqlUtil.Base;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public class TaskProduct extends Thread
{
private static String TAG="TaskProduct";
public int Action;
public static final int ListAll=0;
public static final int Add=1;
private ArrayList<Product> arrproduct=new ArrayList<>();
private ArrayList<String> arrtip;
private Connection con=null;
public String Name;
public int Num;
private Handler handler;
public TaskProduct( Handler handler)
{
this.handler=handler;
arrtip=new ArrayList<>();
}
private void initconn()
{
String url= Base.url;
String user=Base.user;
String passwrod=Base.password;
try
{
Class.forName("net.sourceforge.jtds.jdbc.Driver");//固定写法
Log.v(TAG,"引擎加载成功!");
//con = DriverManager.getConnection("jdbc:jtds:sqlserver://10.0.2.2:1433/dbtest;charset=gbk", "sa", "123");//ip:数据库的IP db:数据库名字 user:数据库用户名 pwd:用户名对应密码
con= DriverManager.getConnection(url,user,passwrod);
//str="Connection初始化成功";
}
catch (Exception e)
{
e.printStackTrace();
Log.v("yzw",e.toString());
arrtip.add(e.toString());
}
}
public ArrayList<String> getArrTip()
{
return arrtip;
}
public ArrayList<Product> getArrProduct()
{
return arrproduct;
}
@Override
public void run()
{
initconn();//初始化引擎要放到分线程中
switch (Action)
{
case ListAll:
excuteListAll(true);
break;
case Add:
excuteAdd(true);
break;
}
}
//数据库存操作开始
private void excuteListAll(boolean islaststep)
{
ResultSet rs=null;
PreparedStatement sql=null;
try
{
Statement sta;
// sta = con.createStatement(); // 实例化Statement对象
// 执行SQL语句,返回结果集
sql=con.prepareStatement("{call dbo.p_my_ProductList}");
rs=sql.executeQuery();
while (rs.next())
{
Product item=new Product();
item.Id=rs.getInt("Id");
item.Name=rs.getString("Name");
item.Num=rs.getInt("Num");
arrproduct.add(item);
}
rs.close();
sql.close();
}
catch (Exception e)
{
arrproduct=null;
e.printStackTrace();
arrtip.add(e.toString());
Log.v(TAG,e.toString());
}
finally
{
if (islaststep) //最后一步行发送信息
{
handler.sendEmptyMessage(ListAll);
}
}
}
private void excuteAdd(boolean islaststep)
{
ResultSet rs=null;
PreparedStatement sql=null;
try
{
sql=con.prepareCall("{call dbo.p_my_ProductAdd(?,?)}"); //注意顺序
sql.setString(1, Name);
sql.setInt(2, Num);
//Log.v(TAG,new Timestamp(BrithDay.getTime()));
sql.execute();
sql.close();
}
catch (Exception e)
{
e.printStackTrace();
arrtip.add(e.toString());
}
finally
{
excuteListAll(false);
if (islaststep) //最后一步行发送信息
{
handler.sendEmptyMessage(Add);
}
}
arrtip.add("添加成功!");
}
//数据库存操作结束
}
6.然后在activity对应的布局文件写一个简单的界面,代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/TVList"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="品名"/>
<EditText
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/ETName"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数量"/>
<EditText
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/ETNum"
android:inputType="number"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/BtnAdd"
android:text="添加"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/BtnList"
android:text="列出"/>
</LinearLayout>
</LinearLayout>
7.在Activity类中实现最终调用代码,如下
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.WorkSource;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.sqlsrver_dircet.Bean.Product;
import com.example.sqlsrver_dircet.Task.TaskProduct;
import java.util.ArrayList;
import swaddle.yinzhenwei.waitdialog.WaitDialog;
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
private TextView tvlist;
private EditText etname;
private EditText etnum;
private WaitDialog waitDialog;
private TaskProduct taskProduct;
private ArrayList<Product> arrproduct;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvlist=findViewById(R.id.TVList);
etname=findViewById(R.id.ETName);
etnum=findViewById(R.id.ETNum);
waitDialog=new WaitDialog(this);
findViewById(R.id.BtnAdd).setOnClickListener(this);
findViewById(R.id.BtnList).setOnClickListener(this);
RunList();
}
//运行分线程开始
private void RunAdd()
{
waitDialog.show();
taskProduct=new TaskProduct(handler);
taskProduct.Action=TaskProduct.Add;
taskProduct.Name=etname.getText().toString();
taskProduct.Num=Integer.parseInt(etnum.getText().toString());
taskProduct.start();
}
private void RunList()
{
waitDialog.show();
taskProduct=new TaskProduct(handler);
taskProduct.Action=TaskProduct.ListAll;
taskProduct.start();
}
//运行分线程结束
//handler处理开始
private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
case TaskProduct.ListAll:
HandleListAll();
break;
case TaskProduct.Add: //添加后刷新一下列表;
HandleListAll();
break;
}
showtip();
// tiplist.clear();
waitDialog.dismiss();
}
};
private void HandleListAll()
{
ArrayList<Product> arrProduct=new ArrayList<>();
arrProduct=taskProduct.getArrProduct();
String out="";
if (arrProduct!=null)
{
for (int i=0;i<arrProduct.size();i++)
{
Product item=arrProduct.get(i);
String name=item.Name;
int num=item.Num;
out+=String.format("品名:%s 库存:%d\n",name,num);
}
tvlist.setText(out);
}
}
//handler处理结束
private void showtip()
{
ArrayList<String> ListTip=taskProduct.getArrTip();
String tip="";
if (ListTip!=null)
{
if (ListTip.size()>0)
{
for (int i=0;i<ListTip.size()-1;i++)
{
tip+=ListTip.get(i)+"\n";
}
tip+=ListTip.get(ListTip.size()-1); //最后一行不换行
//Toast.makeText(this,tip,Toast.LENGTH_SHORT).show();
}
if (tip.length()>0)
{
Toast.makeText(this,tip,Toast.LENGTH_SHORT).show();
//list.setText(tip);
}
ListTip.clear();
tip="";
}
}
@Override
public void onClick(View view)
{
switch (view.getId())
{
case R.id.BtnAdd:
RunAdd();
break;
case R.id.BtnList:
RunList();
break;
}
}
}
好了,运行程序,如图,这里只实现了列出所有数据和添加数据,其它诸如修改、删除,根据索引读取数据请读者试着模仿教程自己写吧。