# Android - MsSQL



## plex88 (30. Jul 2012)

Guten Morgen miteinander!
Ich versuche seit einigen Tagen in meiner Android app vergeblich auf einen Microsoft SQL Server 2008R2 zu connecten. Als Library verwende ich JTDS. Ich zeige euch hier meine Connection Klasse:

```
public ArrayList<String> GetData()
	   {
		ArrayList<String> tmp = new ArrayList<String>();
	      try {
	         Class.forName("net.sourceforge.jtds.jdbc.Driver");
	         Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://xxxxxxxx.stratoserver.net:1433;instance=SQLEXPRESS;user=sa;password=pass");
	         
	         Statement statement = conn.createStatement();
	         String queryString = "SELECT * FROM test.dbo.artikel";
	         ResultSet rs = statement.executeQuery(queryString);
	         while (rs.next()) 
	         {
	        	 tmp.add(rs.getString(1));
	        	 tmp.add(rs.getString(2));
	        	 tmp.add(rs.getString(3));
	        	 tmp.add(rs.getString(4));
	        	 tmp.add(rs.getString(5));
	         }
	         return tmp;
	      } catch (Exception e) {
	         e.printStackTrace();
	         return tmp;
	      }
	   }
```
In der Logcat gibt es folgendes auszusetzten:

```
07-30 11:04:27.339: W/System.err(7503): java.sql.SQLException: Unable to get information from SQL Server: xxxxxxxx.stratoserver.net.
07-30 11:04:27.339: W/System.err(7503): 	at net.sourceforge.jtds.jdbc.MSSqlServerInfo.<init>(MSSqlServerInfo.java:97)
07-30 11:04:27.339: W/System.err(7503): 	at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:276)
07-30 11:04:27.339: W/System.err(7503): 	at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:187)
07-30 11:04:27.339: W/System.err(7503): 	at java.sql.DriverManager.getConnection(DriverManager.java:175)
07-30 11:04:27.347: W/System.err(7503): 	at java.sql.DriverManager.getConnection(DriverManager.java:140)
07-30 11:04:27.347: W/System.err(7503): 	at com.android.Test.artikel.ConnectMSSQLServer.GetData(ConnectMSSQLServer.java:15)
07-30 11:04:27.347: W/System.err(7503): 	at com.android.Test.artikel.TestArtikel$4.onClick(TestArtikel.java:184)
07-30 11:04:27.347: W/System.err(7503): 	at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
07-30 11:04:27.347: W/System.err(7503): 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 11:04:27.347: W/System.err(7503): 	at android.os.Looper.loop(Looper.java:137)
07-30 11:04:27.347: W/System.err(7503): 	at android.app.ActivityThread.main(ActivityThread.java:4896)
07-30 11:04:27.347: W/System.err(7503): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-30 11:04:27.347: W/System.err(7503): 	at java.lang.reflect.Method.invoke(Method.java:511)
07-30 11:04:27.355: W/System.err(7503): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
07-30 11:04:27.355: W/System.err(7503): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
07-30 11:04:27.355: W/System.err(7503): 	at dalvik.system.NativeStart.main(Native Method)
```
Der Server ist ein Rootserver von Strato und ich kann auch problemlos im Büro per Management Studio drauf zugreifen. Deswegen kann ich ein Verbindungsproblem ausschliessen. Es würde mich sehr freuen wenn Ihr einen Tipp für mich hättet dieses Problem zu lösen denn ich komm einfach nicht weiter


----------



## nillehammer (30. Jul 2012)

Muss es denn der jtds-Driver sein? Was spricht gegen den jdbc-Treiber von Microsoft?


----------



## plex88 (30. Jul 2012)

weil er mir dann diesen fehler hier wirft:

```
07-30 12:04:14.597: E/dalvikvm(9745): Could not find class 'javax.sql.XAConnection', referenced from method com.microsoft.sqlserver.jdbc.SQLServerConnection.poolCloseEventNotify
```
ein import von "javax.sql.*;" bringt leider auch nichts.


----------



## SlaterB (30. Jul 2012)

mal den Gedanken eingeworfen, vielleicht schon bekannt und einbezogen, dann zumindest klargestellt:
https://groups.google.com/forum/?fromgroups#!topic/android-developers/yOh84ICDzLw



> In general you don't want to do that - connect directly to your SQL
> server from Android.  If your Android device is on the same subnet,
> and you configure host resolution and port access, you *might* be able
> to do that, I have never really thought to try, but it's certainly not
> ...




wenn ich weiter umherschaue wird das auch woanders empfohlen, es gibt anscheinend kein Tutorial für Android direkt auf eine DB?
du kannst das natürlich dennoch wünschen, aber ob das so sinnvoll ist wenn du dann Hilfe anderer anfragst?
nun gut, auch dann denkbar, dafür ist ein Forum da,
aber es sei nun zumindest erwähnt, dass das anscheinend eher Bastelstand als normales Vorgehen ist, 
Titel noch bisschen angepasst


----------



## plex88 (30. Jul 2012)

Also ich habs jetzt hinbekommen! Natürlich Teile ich das Ergebnis, in diesen Fall wird eine Artikelnummer übergeben und mithilfe dieser die Spalte in der Artikeldatenbank ausgelesen.

```
public ArrayList<String> dbConnect(String artikelnummer,String server,String username,String password,String database)
   {
	   ArrayList<String> tmp = new ArrayList<String>();
	   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
	   StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
       try
       {
           Class.forName("net.sourceforge.jtds.jdbc.Driver");
           Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://"+server+":1433/"+database,username,password);
           Statement statement = conn.createStatement();
	       String queryString = "SELECT * FROM "+database+".dbo.artikel WHERE artikelnummer='"+artikelnummer+"';";
	       ResultSet rs = statement.executeQuery(queryString);
	       while (rs.next()) 
	       {
	       	 tmp.add(rs.getString(1));
	       	 tmp.add(rs.getString(2));
	       	 tmp.add(rs.getString(3));
	       	 tmp.add(rs.getString(4));
	       	 tmp.add(rs.getString(5));
	       }
	       conn.close();
           return tmp;
       }
       catch (Exception e)
       {
           e.printStackTrace();
           return tmp;
       }
   }
```


----------



## SlaterB (30. Jul 2012)

der Fehler trat doch bei getConnection() auf, deine Query war und ist wohl herzlich egal,

ein richtiger Connection-String mit "jdbc:jtds:sqlserver://" usw. mag wichtig sein, sonst halt richtige externe Treiber

edit:
>   StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());

usw. klingt auch interessant, sind das wichtige Zeilen zur Vermeidung des Fehlers?


----------



## plex88 (30. Jul 2012)

Ja ohne striken Modus funktionierts nicht


SlaterB hat gesagt.:


> der Fehler trat doch bei getConnection() auf, deine Query war und ist wohl herzlich egal,
> 
> ein richtiger Connection-String mit "jdbc:jtds:sqlserver://" usw. mag wichtig sein, sonst halt richtige externe Treiber
> 
> ...


----------

