繁体   English   中英

有时与Android的JDBC连接不起作用

[英]Sometimes JDBC connection with Android doesn't work

几天前,我开始开发一个Android应用程序,我决定使用JDBC进行数据库连接(数据库在云中),而且我知道使用php Web服务更安全。 这是我的问题:

直到昨天,我仍然能够建立连接并获取查询结果并登录到该应用程序,但是不知何故我现在无法做到这一点。 我正在为数据库使用Google Cloud Sql ,并且一切正常,我可以通过Mysql Workbench连接到我的数据库并执行相同的查询。

有趣的是,当我尝试使用错误的密码登录到应用程序时,出现登录失败错误,这意味着我从db获得了结果,但是使用正确的密码却什么也没得到,这很奇怪。

谁能猜出可能出什么问题了?

这是我的数据库连接类

public class DBTransactions {  
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://***:3306/";

//  Database credentials
static final String DB_Name = "dbname";
static final String USER = "user";
static final String PASS = "pass";

public static Nurse NurseLogin(String username, String pass) {
    Connection conn = null;
    Statement stmt = null;
    Nurse nurse= new Nurse();
    try {//STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection
        System.out.println("Connecting to database...");
        conn = DriverManager.getConnection(DB_URL + DB_Name, USER, PASS);

        //STEP 4: Execute a query
        System.out.println("Creating statement...");
        stmt = conn.createStatement();
        String sql;
        sql = "SELECT * FROM falldb.nurse WHERE username='" + username + "' AND pass='" + pass + "'";
        ResultSet rs = stmt.executeQuery(sql);
        System.out.println("Query!!");

        //STEP 5: Extract data from result set
        while (rs.next()) {
            System.out.println("Data exist!!");
            //Retrieve by column name
            nurse.setID(rs.getInt("idNurse"));
            nurse.setName(rs.getString("name"));
            nurse.setSurname(rs.getString("surname"));
            nurse.setUsername(rs.getString("username"));
            nurse.setPass(rs.getString("pass"));

            //Display values
            System.out.print("ID: " + nurse.getID());
            System.out.print(", First: " + nurse.getName());
            System.out.println(", Last: " + nurse.getSurname());
            System.out.println("Finished!!");
        }
        //STEP 6: Clean-up environment
        rs.close();
        stmt.close();
        conn.close();
    } catch (SQLException se) {//Handle errors for JDBC
        se.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //finally block used to close resources
        try {
            if (stmt != null)
                stmt.close();
        } catch (SQLException se2) {
        }
        try {
            if (conn != null)
                conn.close();
        } catch (SQLException se) {
            se.printStackTrace();
        }//end finally try
    }//end try
    return nurse;
 }
}

这是Login.class,我将其称为DBTransactions.NurseLogin

public class Login extends Activity {

Button btnLogin;
EditText etUser;
EditText etPass;
TextView tvResult;

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

    btnLogin = (Button) findViewById(R.id.btnLogin);
    btnLogin.setOnClickListener(clickLogin);

    etUser = (EditText) findViewById(R.id.etUser);
    etPass = (EditText) findViewById(R.id.etPass);
    tvResult = (TextView) findViewById(R.id.tvResult);
}
public View.OnClickListener clickLogin = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final String u = etUser.getText().toString();
        final String p = etPass.getText().toString();

        new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] params) {
                return DBTransactions.NurseLogin(u, p);
            }
            @Override
            protected void onPostExecute(Object o) {

                Nurse nurse = (Nurse) o;
                if (nurse.getName() != null) {
                    tvResult.setText("Welcome " + nurse.getName().toUpperCase());

                    Intent i = new Intent(Login.this, PatientOperations.class);
                    i.putExtra("objects.Nurse", nurse);
                    startActivity(i);
                } else {
                    tvResult.setText("Login Failed");
                }
            }
        }.execute();
    }
 };
}

经过几天的尝试和失败,我终于找到了引起问题的原因。 似乎当使用SELECT *从db中选择所有列时,一切正常。 但是,当尝试使用WHERE子句时,出现了问题。

这有效

sql = "SELECT * FROM falldb.nurse";

这不是

sql = "SELECT * FROM falldb.nurse WHERE username='" + username + "' AND pass='" + pass + "'";

解决方案是在使用WHERE子句而不是使用*时使用列的确切名称。 我将代码更改为此:

    sql = "SELECT idNurse,name,surname,isAdmin FROM falldb.nurse WHERE username='" + username + "' AND pass='" + pass + "'";

现在我得到了结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM