Java 数据库连接类一直将连接返回为空



我已经为我的数据库连接创建了一个公共类,因为在整个应用程序中运行各种数据库查询

每次我调用类时con总是返回 Null 但是,如果我在类之外使用它,并直接在活动中使用它,那么它就会连接并运行。 我不知道为什么,非常感谢任何正确方向的指示。

以下是我的 ConnectionManager 类:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionManager {
static String serverName ="192.168.1.5";
static String serverPort ="1433";
static String databaseName ="DBNAME";
static String db = String.format("jdbc:jtds:sqlserver://%s:%s/%s", serverName, serverPort, databaseName);
static String un = "sa";
static String pass = "";
static Connection con;

public static Connection getConnection() {
try {
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con = DriverManager.getConnection(db, un, pass);
} catch (SQLException ex) {
// log an exception. fro example:
System.out.println("Failed to create the database connection.");
}
} catch (ClassNotFoundException ex) {
// log an exception. for example:
System.out.println("Driver not found.");
}
return con;
}
}

在我的活动中,我称之为:

try {
con = ConnectionManager.getConnection();
if (con == null) {
z = "Check Your Internet Access!";
Toast.makeText(StockEnquiry.this, z, Toast.LENGTH_LONG).show();
} else {
stmt = con.createStatement();
String query = "select * from Details where ID= '1111'  ";
rs = stmt.executeQuery(query);
if (rs.next()) {
String sCode = rs.getString("Short_Code");
String sDesc = rs.getString("Short_Desc");
Toast.makeText(StockEnquiry.this, (sCode + " " + sDesc), Toast.LENGTH_LONG).show();
con.close();
} else {
Toast.makeText(StockEnquiry.this,"Invalid Code!", Toast.LENGTH_LONG).show();
}
Toast.makeText(StockEnquiry.this, "Message1", Toast.LENGTH_LONG).show();
}
} catch (Exception ex) {
isSuccess = false;
z = ex.getMessage();
Toast.makeText(StockEnquiry.this, "Appears to have failed in catch", Toast.LENGTH_LONG).show();
}
}
}

所以我得到的消息是:android.os.NetworkOnMainThreadException'经过一些挖掘,我相信我遇到了这个问题,因为我没有将其作为异步任务运行。

可以消除此限制

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

因此,连接类将如下所示。

import android.os.StrictMode;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionManager {
static StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
static String serverName ="192.168.1.1";
static String serverPort ="1433";
static String databaseName ="DatabaseName";
static String db = String.format("jdbc:jtds:sqlserver://%s:%s/%s", serverName, serverPort, databaseName);
static String un = "Username";
static String pass = "Password";
static Connection con;

public static Connection getConnection() {
try {
try {
StrictMode.setThreadPolicy(policy);
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con = DriverManager.getConnection(db, un, pass);
} catch (SQLException ex) {
// log an exception. fro example:
System.out.println("Failed to create the database connection.");
}
} catch (ClassNotFoundException ex) {
// log an exception. for example:
System.out.println("Driver not found.");
}
return con;
}
}

从活动内调用代码与原始帖子无关。

作为由此产生的连锁反应,您可能会在网络连接/覆盖范围不佳时遇到应用程序崩溃/锁定或缓慢。 所以这有点牺牲,但可以用其他方式处理。

最新更新