【发布时间】: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
标签: android sql-server jdbc