尝试将 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.conn
在 doInBackground
中初始化,它在不同的线程上运行。 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 的 JDBC 连接到 SQL Server Express