Android połączenie przez jdbc z ms sql server

0

Witam, mam muszę napisać aplikację która połączy się z baza danych ms sql. Wiem że tak się tego nie robi ale na początek chciałem nawiązać połączenie za pomocą jdbc. Mam kod taki jak poniżej ale za każdym razem gdy chce się połączyć to dostaje "Check your internet access".
Próbowałem łączyć sie z moją bazą i bazą kolegi do której bez problemu łącze się przez sql developer. Może ktoś z was ma jeszcze jakieś koncepcje dlaczego nie mogę nawiązać połączenia. Na stronie z kodem sporo osób pisało że kod działa.


    import android.annotation.SuppressLint;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.StrictMode;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;

    /*
        This source code could be used for academic purposes only. Posting on other websites or blogs is only allowed with a dofollow link to the orignal content.
    */

    public class MainActivity extends ActionBarActivity
    {
        // Declaring layout button, edit texts
        Button login;
        EditText username,password;
        ProgressBar progressBar;
        // End Declaring layout button, edit texts

        // Declaring connection variables
        Connection con;
        String un,pass,db,ip;
        //End Declaring connection variables

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

            // Getting values from button, texts and progress bar
            login = (Button) findViewById(R.id.button);
            username = (EditText) findViewById(R.id.editText);
            password = (EditText) findViewById(R.id.editText2);
            progressBar = (ProgressBar) findViewById(R.id.progressBar);
            // End Getting values from button, texts and progress bar

            // Declaring Server ip, username, database name and password
            ip = "your server ip here";
            db = "your database name here";
            un = "your username for that database here";
            pass = "your password for that database here";
            // Declaring Server ip, username, database name and password

            // Setting up the function when button login is clicked
            login.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    CheckLogin checkLogin = new CheckLogin();// this is the Asynctask, which is used to process in background to reduce load on app process
                    checkLogin.execute("");
                }
            });
            //End Setting up the function when button login is clicked
        }

        public class CheckLogin extends AsyncTask<String,String,String>
        {
            String z = "";
            Boolean isSuccess = false;

            @Override
            protected void onPreExecute()
            {
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            protected void onPostExecute(String r)
            {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, r, Toast.LENGTH_SHORT).show();
                if(isSuccess)
                {
                    Toast.makeText(MainActivity.this , "Login Successfull" , Toast.LENGTH_LONG).show();
                    //finish();
                }
            }
            @Override
            protected String doInBackground(String... params)
            {
                String usernam = username.getText().toString();
                String passwordd = password.getText().toString();
                if(usernam.trim().equals("")|| passwordd.trim().equals(""))
                    z = "Please enter Username and Password";
                else
                {
                    try
                    {
                        con = connectionclass(un, pass, db, ip);        // Connect to database
                        if (con == null)
                        {
                            z = "Check Your Internet Access!";
                        }
                        else
                        {
                            // Change below query according to your own database.
                            String query = "select * from login where user_name= '" + usernam.toString() + "' and pass_word = '"+ passwordd.toString() +"'  ";
                            Statement stmt = con.createStatement();
                            ResultSet rs = stmt.executeQuery(query);
                            if(rs.next())
                            {
                                z = "Login successful";
                                isSuccess=true;
                                con.close();
                            }
                            else
                            {
                                z = "Invalid Credentials!";
                                isSuccess = false;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        isSuccess = false;
                        z = ex.getMessage();
                    }
                }
                return z;
            }
        }


        @SuppressLint("NewApi")
        public Connection connectionclass(String user, String password, String database, String server)
        {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            Connection connection = null;
            String ConnectionURL = null;
            try
            {
                Class.forName("net.sourceforge.jtds.jdbc.Driver");
                ConnectionURL = "jdbc:jtds:sqlserver://" + server + database + ";user=" + user+ ";password=" + password + ";";
                connection = DriverManager.getConnection(ConnectionURL);
            }
            catch (SQLException se)
            {
                Log.e("error here 1 : ", se.getMessage());
            }
            catch (ClassNotFoundException e)
            {
                Log.e("error here 2 : ", e.getMessage());
            }
            catch (Exception e)
            {
                Log.e("error here 3 : ", e.getMessage());
            }
            return connection;
        }
    }
                

 
0

Masz w AndroidManifest.xml ?

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
0

Tak dodałem pozwolenie na internet. W miejsce ip wpisuje ip serwera czyli u mnie komputera na którym stoi ms sql serwer. Databese name to nazwa bazy którą stworzyłem a nazwa użytkownika to sa albo inny user którego sam utworzyłem.
Mam do was jeszcze dwa pytania.
Czy to pozwolenie w manifescie dotyczy tylko danych komórkowych czy wifi też będzie działać?
Czy możliwe że to zadziała bez podania numeru portu?

0

Teraz sprawdziłem że ja w manifescie mam coś <uses-permission android:name="android.permission.INTERNET" />.
Czym to się różni?

1

jedno pozwala CI odczytać stan sieci a drugi się z nią łączyć.

Tak czy siak wyrzuć ten kod do śmieci. Tak się tego nie robi i tyle

0

Wiem doskonale o tym ale potrzebuje to zrobić akurat w ten beznadziejny sposób z użyciem jdbc :/

0
ConnectionURL = "jdbc:jtds:sqlserver://" + server + database + ";user=" + user+ ";password=" + password + ";";

Według dokumentacji dołączanie średnika na końcu urla to "common mistake".
"server + database" gdzie jest slash między serwerem a nazwą bazy danych?

0

Dziękuje za pomoc :) postaram się to poprawić i sprawdzę czy działa.
Gdybym chciał jednak zrezygnować z tego rozwiązania to czy mogę prosić o jakieś wskazówki jak z poziomu android połączyć sie z webservicem?

2
adamek339 napisał(a):

Dziękuje za pomoc :) postaram się to poprawić i sprawdzę czy działa.
Gdybym chciał jednak zrezygnować z tego rozwiązania to czy mogę prosić o jakieś wskazówki jak z poziomu android połączyć sie z webservicem?

Retrofit

1 użytkowników online, w tym zalogowanych: 0, gości: 1