为什么Android连接到SQL数据库不起作用

时间:2020-03-26 13:18:15

标签: android sql sql-server

我尝试使用JDBC连接器将我的Android应用程序连接到SQL DB。如果我在Netbeans中尝试过,那么就可以了,并且连接正常。我正在使用连接器:mssql-jdbc-8.2.2.jre13

package sql_server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Sql_server {

    public static void main(String[] args) {
        String url = "jdbc:sqlserver://localhost\\MSSQLSERVER19;databaseName=Helios002";
        String user = "user";
        String password = "password";

        String query = "select top 1 skupzbo, regcis, nazev1 from Tabkmenzbozi order by id desc";

        try ( Connection con = DriverManager.getConnection(url, user, password);  Statement st = con.createStatement();  ResultSet rs = st.executeQuery(query)) {
            if (rs.next()) {
                System.out.println(rs.getString(1) + rs.getString(2) + rs.getString(3));
            }
        } catch (SQLException ex) {
            System.out.println("An error occurred while connecting MySQL databse");
            ex.printStackTrace();
        }
    }
}

但是在android studio中它不起作用。我使用的是Connector:mssql-jdbc-8.2.2.jre11,因为android studio不支持mssql-jdbc-8.2.2.jre13。

package com.example.hepopr.ui.gallery;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.example.hepopr.R;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;

public class GalleryFragment extends Fragment {

    private TextView test;
    public static String url = "jdbc:sqlserver://localhost\\MSSQLSERVER19;databaseName=Helios002";
    public static final String user = "user";
    public static final String pass = "password";

    private GalleryViewModel galleryViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        galleryViewModel =
                ViewModelProviders.of( this ).get( GalleryViewModel.class );
        View root = inflater.inflate( R.layout.fragment_gallery, container, false );
        final TextView textView = root.findViewById( R.id.text_gallery );
        galleryViewModel.getText().observe( getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText( s );
            }
        } );

        test=root.findViewById( R.id.textView2 );


        return root;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );

        Timer timer = new Timer();
        //Set the schedule function
        timer.scheduleAtFixedRate( new TimerTask() {
            @Override
            public void run() {
                new MyTask().execute();

            }
        },0, 30000 );   // 1000 Millisecond  = 1 second

    }


    private class MyTask extends AsyncTask<Void, Void, Void> {
        private String STvody = "", STvzduchu = "", SVlhkost = "", SCerpadlo = "", SHladina = "", SSvetlo = "", SDate = "", STlak = "";

        @Override
        protected Void doInBackground(Void... arg0) {

            try {
                Class.forName( "com.microsoft.sqlserver.jdbc.SQLServerDriver" );
                Connection con = DriverManager.getConnection( url, user,pass);
                if (con == null) {
                    Toast.makeText( getActivity(), "Nepřipojeno", Toast.LENGTH_SHORT ).show();
                } else {
                    Statement st = con.createStatement();
                    String sql = "select top 1 regcis from Tabkmenzbozi order by id desc ";

                    final ResultSet rs = st.executeQuery( sql );
                    if (rs == null) {
                        Toast.makeText( getActivity(), "Bez dat", Toast.LENGTH_SHORT ).show();
                    }
                    Objects.requireNonNull( rs ).next();
                    SDate = rs.getString( 1 );

                    String pattern = "HH:mm:ss";
                    DateFormat df = new SimpleDateFormat(pattern);
                    Date today = Calendar.getInstance().getTime();
                   // todayAsString = df.format( today );
                    con.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            test.setText( SDate );
            super.onPostExecute( result );
        }
    }
}

工作室返回错误:


W/System.err: com.microsoft.sqlserver.jdbc.SQLServerException: The connection to the host localhost, named instance mssqlserver19 failed. Error: "java.net.SocketTimeoutException: Poll timed out". Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434.  For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the host.
W/System.err:     at com.microsoft.sqlserver.jdbc.SQLServerConnection.getInstancePort(SQLServerConnection.java:6068)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.primaryPermissionCheck(SQLServerConnection.java:2457)
W/System.err:     at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2200)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2067)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1204)
W/System.err:     at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:825)
        at java.sql.DriverManager.getConnection(DriverManager.java:569)
        at java.sql.DriverManager.getConnection(DriverManager.java:219)
W/System.err:     at com.example.hepopr.ui.gallery.GalleryFragment$MyTask.doInBackground(GalleryFragment.java:84)
        at com.example.hepopr.ui.gallery.GalleryFragment$MyTask.doInBackground(GalleryFragment.java:76)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

您能帮我,什么是错? 谢谢。

1 个答案:

答案 0 :(得分:0)

不要这样做。曾经您的数据库密码在您的代码中,该代码将发送到设备。这意味着只要花30分钟的时间,任何人都可以获取您的数据库密码并修改您的数据。您应该只通过Web服务与远程数据库进行交互,因此只有Web服务(在您的硬件上)才具有数据库的密钥。其他任何事情都不安全。

JDBC可以安全地用于服务器端,因为它仅在您的服务器上运行。但是永远不要在不受物理控制的设备上使用它。