【问题标题】:NullPointerException when trying to connect android to sql server尝试将 android 连接到 sql server 时出现 NullPointerException
【发布时间】:2016-07-04 07:13:55
【问题描述】:

我正在我的 Android 应用上进行登录活动。尝试连接到数据库时,我不断收到 IOException。我几乎尝试了所有方法: 1-我已将端口设置为 1433 2-我已经启动了sql浏览器服务 3-我已经包含了 jtds .jar 文件 4-我已禁用防火墙 5- 我在配置管理器中启用了 TCP/IP 服务

这是查询代码(这是单击按钮时调用的函数)

public void logIn(View view)
    {
        Toast.makeText(getApplicationContext(),ipValue,Toast.LENGTH_LONG).show();
        try {
            DBConnect dbConnect = new DBConnect(getApplicationContext());
            dbConnect.execute();
            LogInStatement="select count(*) from users where username=? AND password=?";
            preparedStatement=dbConnect.conn.prepareStatement(LogInStatement);
            preparedStatement.setString(1,userNameEditText.getText().toString());
            preparedStatement.setString(2,passwordEditText.getText().toString());
            ResultSet rs = preparedStatement.executeQuery();
            while (rs.next()) {
                count = rs.getInt(1);
            }
            if (count != 0) {
                Intent userScreenIntent = new Intent(this, UserScreen.class);
                startActivity(userScreenIntent);
            } else {
                Toast.makeText(getApplicationContext(), "بيانات الدخول غير صحيحة", Toast.LENGTH_LONG).show();
            }
        }
        catch(Exception e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

这是连接代码:

public class DBConnect extends AsyncTask<String, Void, String>
    {
        private Context ctx;
        SharedPreferences prefs;
        Connection conn;
        String ipValue;
        public DBConnect(Context ctx)
        {
            this.ctx=ctx;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //get sharedPreferences here
            prefs = ctx.getSharedPreferences("DoorSystem_SHPREF",
                    Context.MODE_PRIVATE);
            ipValue=prefs.getString("IP_VALUE",null);
        }
        @Override
        protected String doInBackground(String... params) {


            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
            String ConnURL = null;
            try {

                Class.forName("net.sourceforge.jtds.jdbc.Driver");
                ConnURL = "jdbc:jtds:sqlserver://" + ipValue + ":1433;databaseName=doors;user=sam123;password=111;";
                conn = DriverManager.getConnection(ConnURL);
            } catch (SQLException se) {
                Log.e("ERRO", se.getMessage());
            } catch (ClassNotFoundException e) {
                Log.e("ERRO", e.getMessage());
            } catch (Exception e) {
                Log.e("ERRO", e.getMessage());
            }
            return null;
        }
    }

编辑: 堆栈跟踪现在向我显示 NullPointerException:

07-04 10:17:32.233 20120-20120/port.doorsystem W/System.err: java.lang.NullPointerException
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at port.doorsystem.LogIn.logIn(LogIn.java:91)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.view.View.performClick(View.java:4508)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.view.View$PerformClick.run(View.java:18675)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.os.Handler.handleCallback(Handler.java:733)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.os.Looper.loop(Looper.java:136)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5584)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
07-04 10:17:32.243 20120-20120/port.doorsystem W/System.err:     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 可以添加堆栈跟踪吗?
  • @PiyushShrivastava 现在它给了我一个 NullPointerException
  • 可能是因为preparedStatement=dbConnect.conn.prepareStatement(LogInStatement);这行。 dbConnect.conndoInBackground 中初始化,它在不同的线程上运行。 prepareStatement 可能在 conn 初始化之前被调用
  • @0xDEADC0DE 你有什么建议修改吗?
  • @SamIbraheem,您可以修改DBConnect 的构造函数以接受上下文和接口,并在DBConnect 的onPostExecute 中调用该接口。在接口的实现中可以放上准备好的语句代码。这样您就可以确定 conn 已初始化并且您也不会得到 NetworkOnMainThreadException

标签: android sql-server jdbc


【解决方案1】:

对此我不太确定,但我猜你在conn 处得到了空指针。这可能是因为您在 Async Task 中初始化它并在它之外使用它。

在理想的方法中,您应该只使用Async Task 返回的输出。您可以返回连接引用 (conn),也可以通过将 PreparedStatement 代码放入 Async Task 并返回 ResultSet 在后台准备语句。

如果您能指出发生异常的确切位置,我可能会为您提供更多帮助。

更新:这应该有效:

后台线程-

  protected Connection doInBackground(String... params) {

        try {

            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            ConnURL = "jdbc:jtds:sqlserver://" + ipValue + ":1433;databaseName=doors;user=sam123;password=111;";
            conn = DriverManager.getConnection(ConnURL);
        } catch (SQLException se) {
            Log.e("ERRO", se.getMessage());
        } catch (ClassNotFoundException e) {
            Log.e("ERRO", e.getMessage());
        } catch (Exception e) {
            Log.e("ERRO", e.getMessage());
        }
        return conn;
    }

登录 -

DBConnect dbConnect = new DBConnect(getApplicationContext());
Connection conn = dbConnect.execute().get();
LogInStatement="select count(*) from users where username=? AND password=?";
preparedStatement=conn.prepareStatement(LogInStatement);

【讨论】:

  • 你是对的,它的声明:prepareStatement=dbConnect.conn.prepareStatement(LogInStatement);但我不知道如何解决它
  • @SamIbraheem 只需将doInBackground() 的返回类型更改为Connection 并将其捕获在变量中并用于准备语句。
  • 感谢您的帮助,但现在它在语句 ResultSet rs = PreparedStatement.executeQuery(); 上给了我一个 android.os.NetworkOnMainThreadException;
  • NetworkOnMainThreadException 在主线程上执行网络任务时发生。在后台线程中执行所有操作。
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多