Android studio连接sqlserver数据库

Posted jacob

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android studio连接sqlserver数据库相关的知识,希望对你有一定的参考价值。

Android studio连接sqlserver数据库

记录我的学习过程:我是android8.0,jdk13.0

1、要先下载jdbc的两个包(我忘记在哪下载了,可以自行搜一下)

注意:下载之后复制到android studio项目app的libs中,然后右键该包,选择add as library,确定之后就可以了。

2、连接sqlserver数据库前必做的事:(以下链接很详细)

如何连接sqlserver数据库_百度知道

3、第一步完成后,就已经知道数据库用户名和密码了,接下来开始写代码:

sqlserver数据库URL是jdbc:jtds:sqlserver://电脑ip地址:1433;DatabaseName=你的数据库名;

ip地址请看此链接:https://jingyan.baidu.com/article/63f2362816d56c0208ab3dd5.html

 (1)MainActivity.java

 1 package com.example.jdbctest;
 2 
 3 import androidx.appcompat.app.AppCompatActivity;
 4 
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.view.View;
 8 import android.view.ViewManager;
 9 import android.widget.Button;
10 import android.widget.EditText;
11 
12 import java.sql.Connection;
13 import java.sql.DriverManager;
14 import java.sql.PreparedStatement;
15 import java.sql.ResultSet;
16 import java.sql.SQLException;
17 import java.sql.Statement;
18 
19 public class MainActivity extends AppCompatActivity implements View.OnClickListener 
20     private Button createDataBase,addData;
21     private EditText resultText;
22     String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
23     //String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=JDBCDemo";
24     String dbURL="jdbc:jtds:sqlserver://192.168.xxx:1433;DatabaseName=JDBCDemo";//数据库连接url
25     String userName="sa";//数据库用户名
26     String userPwd="sasasa";//数据库密码
27     Connection con;
28 
29 
30     @Override
31     protected void onCreate(Bundle savedInstanceState) 
32         super.onCreate(savedInstanceState);
33         setContentView(R.layout.activity_main);
34         init();//初始化组件
35         addData.setOnClickListener(this);
36     
37 
38 
39     private void init() 
40         createDataBase=(Button)findViewById(R.id.create_database);
41         addData=(Button)findViewById(R.id.add_data);
42         resultText=(EditText)findViewById(R.id.result_text);
43     
44 
45 
46     @Override
47     public void onClick(View v) 
48         switch (v.getId())
49             case R.id.add_data:
50                 new Thread(new Runnable() 
51                     @Override
52                     public void run() 
53                         try
54                             Class.forName(driverName); //jdk版本6.0以上可以省略这句话
55                             con= DriverManager.getConnection(dbURL,userName,userPwd);
56                             String sql="select * from Library";
57                             Statement st=con.createStatement();
58                             ResultSet rs=st.executeQuery(sql);
59                             while(rs.next())
60                                 Log.i("MainActivity",rs.getString("书籍名称"));
61                             
62                             rs.close();
63                             st.close();
64                             con.close();
65                             System.out.println("连接数据库成功");
66                         catch(Exception e)
67                             e.printStackTrace();
68                         
69                     
70                 ).start();
71                 break;
72         
73     
74 

查询结果:

碰到的问题:

1.android4.0以上连接数据库不能在主线程执行,要另外来一个子线程去执行,操作看上述代码50-70行。

如果直接在主线程执行,会报以下错误:Attempt to invoke interface method 'java.sql.PreparedStatement java.sql.Connection.prepareStatement(java.lang.String)' on a null object reference

 2.如果你的数据库连接url写成:jdbc:sqlserver://localhost:1433;DatabaseName=JDBCDemo

在eclipse上是可以连接成功的,但在android studio就会报错:com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接。

我也不知道为什么会错,后来上网找了半天解决方法,最后终于解决了,就是将url改成 jdbc:jtds:sqlserver://192.168.56.1:1433;DatabaseName=JDBCDemo。

 最后的牢骚:结果出来的一刻非常非常开心,觉得一切的辛苦都是值得的,虽然现在还在摸索状态,也不清楚以后能不能做程序员,但是每解决完一个问题,我就会感觉自己能继续走下去。

The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL)

1.问题描述:
windows本地测试没有问题,linux(Centos 8)上面运行出现问题。sqlserver 数据库链接报错

报错如下

主要报错:Server chose TLSv1, but that protocol version is not enabled or not supported by the client

java.ext.dirs: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
2020-06-23 16:41:10.267 [main] ERROR com.alibaba.druid.pool.DruidDataSource:936 - init datasource error,
 url: jdbc:sqlserver://192.168.0.174:1433;DatabaseName=xxx;integratedSecurity=false
com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "Server chose TLSv1, but that protocol version is not enabled or not supported by the client.". ClientConnectionId:22917695-6f2a-432e-96e8-e777f4237acc

2.方法1
JDK目录下的jre\\lib\\security,打开java.security

把3DES_EDE_CBC注释掉。保存,测试成功!

补充说明:开发环境改的是上面路径,实际生产环境修改的是JRE下的java.security

3.方法2 
将系统的openjdk 修改为Oracle jdk

openjdk 更改为Oracle jdk
 

数据库大作业—— Android studio连接SQLserver数据库登录界面

在这里插入图片描述

一、Android Studio连接SQLserver数据库

首先连接SQLserver需要向library中导入jdbc的jar包,将下载的jar包复制到libs中,右键包选择 add as library
在这里插入图片描述
可以到官网自行下载,为了方便我也上传了资源。点击下载

接着我们创建一个DBUtil类,封装一个getSQLConnection(String ip, String user, String pwd, String db)类型的函数,用于获取Connection对象。
我们使用jdbc来连接数据库,jdbc获取数据库连接代码如下:

DriverManager.getConnection("jdbc:jtds:sqlserver://" + "你的ip" + ":1433/" + "数据库名" + ";charset=utf8", "数据库账户", "密码");

ip地址为当前连接网络的ip地址,可以在命令提示符(cmd)里输入ipconfig找到。在这里插入图片描述

为了实现登录功能我们还要获取登录界面里EditText里输入的文本和Spinner里的选项,并把数据打包成Bundle,传给DBUtil类,判断账号密码是否正确。具体代码已经贴在了下面。

DBUtil具体代码如下:

public class DBUtil
{
    private  String name=null;
    private  String pass=null;

    public DBUtil(String m,String p){
        this.name=m;
        this.pass=p;
    }
    private static Connection getSQLConnection(String ip, String user, String pwd, String db)
    {
        Connection con = null;
        try
        {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + "你的ip" + ":1433/" + "SCsystem" + ";charset=utf8", "账户", "密码");
        } catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
        return con;
    }

    public String QuerySQL(String name,String pass,String ut)
    {
        String result = "";
        try
        {
            Connection conn= getSQLConnection("你的ip", "账号", "密码", "数据库名称");//根据自己的数据库信息填写对应的值
            String sql=null;
            if(ut=="学生登录") sql = "select * from Student_login where Sno='"+name+"' and  Spassword='"+pass+"'";
            else if(ut=="教师登录") sql= "select * from Teacher_login where Tno='"+name+"' and  Tpassword='"+pass+"'";//加单引号!不然隐式转换会报错查询不出来
            System.out.println(sql);
            Statement stat = conn.createStatement();
            ResultSet rs = stat.executeQuery(sql);
            while (rs.next())
            {
                result= "1" ;
            }
            rs.close();
            conn.close();
        } catch (SQLException e)
        {
            e.printStackTrace();
            result += "查询数据异常!" + e.getMessage();
        }
        return result;
    }
    public static void main(String[] args)
    {
    }
}

MainActivity代码:

public class MainActivity extends AppCompatActivity {

    private Spinner userSpinner=null;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        findViews();
    }

    private void findViews() {
        //Spinner
        userSpinner=(Spinner)findViewById(R.id.spin_1);
        String[] usertype={"学生登录","教师登录"};
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,usertype);
        userSpinner.setAdapter(adapter);

        //EditText
        final EditText musername=(EditText) findViewById(R.id.edit_text_1);
        final EditText mpassword=(EditText) findViewById(R.id.edit_text_2);
        //button
        Button button1 = (Button) findViewById(R.id.button_1);
        WorkThread wt=new WorkThread();
        wt.start();
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String ut = userSpinner.getSelectedItem().toString();
                String no = musername.getText().toString().trim();
                String pw = mpassword.getText().toString().trim();
                Message m=handler.obtainMessage();
                Bundle b=new Bundle();
                b.putString("name",no);
                b.putString("pass",pw);
                b.putString("ut",ut);
                m.setData(b);
                handler.sendMessage(m);

            }
        });
        //隐藏标题栏
        ActionBar actionbar= getSupportActionBar();
        if(actionbar!=null){
            actionbar.hide();
        }
    }

    //登录查询
    class WorkThread extends  Thread{
        @Override
        public  void run(){
            Looper.prepare();
            handler=new Handler(){
                @Override
                public  void handleMessage(Message m){
                    super.handleMessage(m);
                    Bundle b= m.getData();//得到与信息对用的Bundle
                    String name=b.getString("name");//根据键取值
                    String pass=b.getString("pass");
                    String ut=b.getString("ut");
                    DBUtil db=new DBUtil(name,pass);//调用数据库查询类
                    String ret=db.QuerySQL(name,pass,ut);//得到返回值
                    if (ret.equals("1"))//为1,页面跳转,登陆成功
                    {
                        Intent localIntent = new Intent();
                        localIntent.setClass(MainActivity.this, StudentView.class);
                        MainActivity.this.startActivity(localIntent);
                        Toast.makeText(MainActivity.this, "登录成功",Toast.LENGTH_SHORT).show();//显示提示框
                        return;
                    }
                    Toast.makeText(MainActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();

                }
            };
            Looper.loop();//Looper循环,通道中有数据执行,无数据堵塞
        }
    }
}

二、登录界面

这个界面经过来来回回地更改,也算是变得好看了点(CardView真好用)
没什么可说的就把布局文件贴出来好了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#DCDCDC">


    <androidx.cardview.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:alpha="0.7"
        app:cardCornerRadius="15dp"
        app:cardElevation="0dp"
        android:background="@drawable/school"
        app:cardBackgroundColor = "#FFFFFF">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="137dp"
                android:background="@drawable/school1" />
            <TextView
                android:id="@+id/tv_college_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="30dp"
                android:gravity="center"
                android:text="欢迎来到选课系统"
                android:textColor="@color/purple_200"
                android:textSize="35sp"
                android:textStyle="bold" />
            <EditText
                android:id="@+id/edit_text_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="24dp"
                android:layout_marginTop="30dp"
                android:layout_marginEnd="24dp"
                android:hint="@string/prompt_id"
                android:inputType="number"
                android:selectAllOnFocus="true" />
            <EditText
                android:id="@+id/edit_text_2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="24dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="24dp"

                android:hint="@string/prompt_password"
                android:inputType="textPassword"
                android:selectAllOnFocus="true" />
            <Spinner
                android:id="@+id/spin_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="12dp"
                android:scrollbarSize="20sp"
                android:spinnerMode="dialog"
                android:text="选择账户类型" />
            <Button
                android:id="@+id/button_1"
                android:layout_width="match_parent"
                android:layout_height="72dp"
                android:layout_marginTop="12dp"
                android:layout_marginBottom="8dp"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:layout_gravity="center"
                android:maxLines="1"
                android:shadowColor="#FFF94C87"
                android:text="登录" />
        </LinearLayout>
    </androidx.cardview.widget.CardView>
</LinearLayout>

三、小结

这个部分最难搞的主要还是怎么把数据库连接到SQLserver,自己去寻找方法还是比较头疼的一件事,网上关于如何连接SQLserver的教程其实也不少,但总会多多少少的有些问题,还是自己钻研了一下语句,才做出来的这个登录界面。
如果你也由连接数据库的问题,可以去看看下面这个文章,还是会有帮助的

Android APP连接电脑数据库(以SQL Server为例)
https://blog.csdn.net/qq_40399080/article/details/97630894

以上是关于Android studio连接sqlserver数据库的主要内容,如果未能解决你的问题,请参考以下文章

数据库大作业—— Android studio连接SQLserver数据库登录界面

数据库大作业—— Android studio连接SQLserver数据库登录界面

数据库大作业—— Android studio连接SQLserver数据库登录界面

visual studio如何连接sqlserver中的数据库?如图。

SQLServer Management Studio连接服务器问题,别人客户端可以连,服务器是SQL SERVER2008R2,求助!

Visual Studio 2008不能创建数据库连接出现:未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.