尝试将 android 连接到 sql server 时出现 NullPointerException

Posted

技术标签:

【中文标题】尝试将 android 连接到 sql server 时出现 NullPointerException【英文标题】:NullPointerException when trying to connect android to sql server 【发布时间】: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 【参考方案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 在主线程上执行网络任务时发生。在后台线程中执行所有操作。 ***.com/questions/15894418/… 参考这个。 :)

以上是关于尝试将 android 连接到 sql server 时出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

通过sql server express将Android应用程序连接到sql server

Android Studio 错误:无法连接到守护进程

我无法使用带有 Android Studio 的 JDBC 连接到 SQL Server Express

如何从android设备连接到sql server数据库

将phpmyadmin sql数据库连接到我的android应用程序[关闭]

如何使用库 jTDS JDBC 驱动程序将 android 应用程序连接到 sql server 2012