我已经阅读了一些关于jdts.jar库的文章然后我想实现它到android app,已经做了一些编码,但我总是无法连接数据库sql server。 我第一次尝试远程使用Navicat SQL浏览器,我可以连接它,但当我做android编码时,我无法连接它。已经检查了ip public,username,password和database name,它们与我的android编码相同。这是我的日志猫:
07-20 16:32:49.270 31447-31447/? E/AndroidRuntime? FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.avian.apps.avian/com.avian.apps.avian.LoginActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2186)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.access$600(ActivityThread.java:145)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5099)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
at libcore.io.IoBridge.connectErrno(IoBridge.java:131)
at libcore.io.IoBridge.connect(IoBridge.java:116)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:847)
at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:288)
at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:251)
at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:331)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
at java.sql.DriverManager.getConnection(DriverManager.java:175)
at java.sql.DriverManager.getConnection(DriverManager.java:209)
at com.avian.apps.avian.ConnectionClass.getConnection(ConnectionClass.java:25)
at com.avian.apps.avian.LoginActivity.onCreate(LoginActivity.java:36)
at android.app.Activity.performCreate(Activity.java:5117)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.access$600(ActivityThread.java:145)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5099)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
at dalvik.system.NativeStart.main(Native Method)
和我的ConnectionClass:
public class ConnectionClass {
private Connection connect;
private String driverName = "net.sourceforge.jtds.jdbc.Driver";
private String jdbc = "jdbc:jtds:sqlserver://";
private String host = "x.x.x.x:"; // x.x.x.x : server ip public
private String port = "1433/"; // Port Default SQLServer
private String database = "MOB_APPS";
private String url = jdbc + host + port + database;
private String username = "sa"; // username default SQLServer
private String password = "admin.123";
public Connection getConnection() throws SQLException {
if (connect == null) {
try {
Class.forName(driverName);
try {
connect = DriverManager.getConnection(url, username, password);
Log.d("Success","notifmessage");
} catch (SQLException se) {
Log.d("Failed", "notifmessage");
}
} catch (ClassNotFoundException cnfe) {
Log.d("Class not found "+cnfe,"notifmessage");
}
}
return connect;
}
}
谁能帮我解决这个问题呢?
提前致谢
答案 0 :(得分:0)
在建立连接之前调用此方法
Log.i("Android", " MySQL Connect.");
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
请参阅更新的功能。
public Connection getConnection() throws SQLException {
Log.i("Android", " MySQL Connect.");
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
if (connect == null) {
try {
Class.forName(driverName);
try {
connect = DriverManager.getConnection(url, username, password);
Log.d("Success", "notifmessage");
} catch (SQLException se) {
Log.d("Failed", "notifmessage");
}
} catch (ClassNotFoundException cnfe) {
Log.d("Class not found " + cnfe, "notifmessage");
}
}
return connect;
}
<强>更新强>
我的工作代码注意我使用的旧版本的jar jtds 1.2.7
文件存在最新版本的问题。
public class DBconnection {
public static String User_name = "saxxxx";
public static String User_pass = "xxxxxh";
public static String Db_name = "xxxxx";
static Context mcontext;
public static Connection Conn = null;
public static String Server_ip = "192.168.5.14:1433;";
public static Connection Getconnection() {
Log.i("Android", " MySQL Connect.");
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
String connString = null;
try {
Log.i("SQL Looking", "Start Looking for server");
String driver = "net.sourceforge.jtds.jdbc.Driver";
Class.forName(driver).newInstance();
connString = "jdbc:jtds:sqlserver://" + Server_ip
+ ";databaseName=" + Db_name + ";user=" + User_name
+ ";password=" + User_pass + ";";
Conn = DriverManager.getConnection(connString);
Log.i("Connection", "open DB Class");
} catch (Exception e) {
Toast.makeText(mcontext, e.toString() + "db", Toast.LENGTH_LONG)
.show();
Log.w("Error connection", e.getMessage());
}
return Conn;
}
public static void close_DB() {
try {
Conn.close();
Log.i("Connection", "Close DB Class");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}