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数据库前必做的事:(以下链接很详细)
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.