Datenbankzugriff SQL Server, via .NET funktioniert es..

  • Antworten:15
Rob
  • Forum-Beiträge: 33

07.04.2014, 18:57:38 via Website

Hallo,

ich habe folgendes Problem, an dem ich nun schon den ganzen Tag sitze (langsam verzweifel ich echt!)..

Mehrere verschiedenen Möglichkeiten ohne Erfolg habe ich jetzt schon ausprobiert, aber nichts funktioniert.

Bei der Möglichkeit bei der ich am weitesten war, die aber nun verloren ging, konnte ich via httpwebrequest (post) daten an ein skript senden, allerdings wollte dieses dann nicht auf die DB connecten.

Ich habe die Windows-App von meinem Programm in .NET programmiert (in Visual Basic) und dort kann ich mich ohne Probleme auch von außen auf meinen Server connecten, nur mit Hilfe des Scripts will es nicht.

Da kommt immer das der Computer die Verbindung verweigert :(..

Ich habe auf meinem PC die Datenbank laufen (SQL Server Management Studio 2012).

Kennt jemand eine Möglichkeit darauf zuzugreifen!?

Ps: Das Sample aus meiner Anwendung versuch ich gerade rauszuklabüsern ums euch zu zeigen, aber ich schäze schon fast, dass ich die App mit dem ganzen gefummel zerschossen habe -.-!

— geändert am 07.04.2014, 19:00:49

Antworten
Rob
  • Forum-Beiträge: 33

07.04.2014, 19:24:41 via Website

Ich habe nun folgenden Code, er sagt "no suitable driver found".

Woher bekomme ich den richtigen Treiber und wie installiere ich den :/?

1Connection con = null;
2 try
3 {
4 con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/Database;shutdown=true", "sa", "passwort");
5 }
6 catch ( SQLException e )
7 {
8 MsgBox("Konnte Verbindung nicht aufbauen " + e.toString());
9 }
10 finally
11 {
12 if ( con != null )
13 try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); }
14 }

Ich hab auch gelesen, dass ich den hier vorher aufrufen muss, allerdings habe ich ja leider keinen passenden Treiber:
1Class.forName("com.mysql.jdbc.Driver");

— geändert am 07.04.2014, 19:25:52

Antworten
Georg C.
  • Forum-Beiträge: 235

07.04.2014, 20:10:07 via Website

Hallo,

1...
2con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/Database;shutdown=true", "sa", "passwort");
3 }
4 catch ( SQLException e )
5...
sieht "schwer" -> werde sogar sagen explizit / genau nach "Normale" Java SQL- Verbindung, und hat (VERMUTE) hier im Android nichts zu suchen, bzw wird NIE Funktionieren.
Und das:
1Class.forName("com.mysql.jdbc.Driver");
bestätigt es. ("Normale" -> also "Große Java" SQL- Verbindung)

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Rob
  • Forum-Beiträge: 33

07.04.2014, 20:18:33 via Website

Wie sieht es denn in der Android App aus? Könntest du mir dann da weiterhelfen?
Wie bereits erwähnt bin ich schon den ganzen Tag unermüdlich dabei, aber langsam gebe ich auf..

Ich habe es mittlerweile hinbekommen, dass ich keine Fehler mehr bekomme (verbindungstechnisch etc..), aber das was ich zurückbekomme ist leer :(!

1public void ibtn_Login_Click (View view) {
2 QuerySQLTask task = new QuerySQLTask();
3 task.execute();
4 }
5
6 private class QuerySQLTask extends AsyncTask<String, Void, String>{
7 @Override
8 protected String doInBackground(String... URL){
9 try {
10 Class.forName("com.mysql.jdbc.Driver").newInstance();
11 //this.setTitle("Driver instantiated");
12 } catch (ClassNotFoundException e) {
13 // TODO Auto-generated catch block
14 Log.v("Bla", ".....Class com.mysql.jdbc.Driver not found!");
15 //this.setTitle("");
16 e.printStackTrace();
17 } catch (IllegalAccessException e) {
18 Log.v("Bla", "illegal access");
19 // TODO Auto-generated catch block
20 e.printStackTrace();
21 } catch (InstantiationException e) {
22 //this.setTitle("");
23 Log.v("Bla", "instantiation exception");
24 // TODO Auto-generated catch block
25 e.printStackTrace();
26 }
27
28
29 Connection conn = null;
30 String result = "";
31
32
33 try {
34 conn = DriverManager.getConnection("jdbc:mysql://192.168.178.111/DB;shutdown=true", "sa", "Passwort");
35 } catch (java.sql.SQLException e1) {
36 Log.v("Bla", e1.toString());
37 }
38
39
40
41 try {
42 Statement stmt = null;
43 stmt = conn.createStatement();
44 ResultSet rs = stmt.executeQuery("SELECT * FROM Benutzer");
45
46 while (rs.next()){
47 result = rs.getString(1);
48 }
49 rs.close();
50 stmt.close();
51 conn.close();
52 } catch (java.sql.SQLException e) {
53 e.printStackTrace();
54 }
55
56 return result;
57
58 }
59
60 @Override
61 protected void onPostExecute(String result) {
62 TextView tv = (TextView) findViewById(R.id.tb_Benutzer);
63 tv.setText(result);
64 }
65 }

Also die Variable result ist anschließend leer.. :(!

— geändert am 07.04.2014, 20:22:09

Antworten
Georg C.
  • Forum-Beiträge: 235

07.04.2014, 20:24:16 via Website

ajjjj -> google > android db tutorial

Sorry für Gramatik & Stilistik Fehler.

Antworten
Rob
  • Forum-Beiträge: 33

07.04.2014, 20:27:00 via Website

Ich sagte doch bereits ich bin den ganzen Tag unterwegs..

Ich habe schon wesentlich nach mehr gesucht als das, ich bekomme es allerdings nicht geschissen, wärt ihr dann vll. so freundlich mir zu helfen statt Links zu posten,ich verlange keinen C&P Code aber ein bisschen mehr als ein kommentarlosen Google Link bräuchte ich dann schon...

Es geht wie gesagt um einen Microsoft SQL Server der mithilfe des SQL Management Studios 2012 bearbeitet wird.

Vor allem weiß ich auch nicht ob ich die Lite Variante da benutzen kann (die bei den meisten Suchergebnissen kommt..)..

Vll. komme ich ja schneller weiter wenn in 2-3 Tagen mein Buch endlich da ist..

In keinem gefundenen Beispiel habe ich nun irgendwas mit Connection.Open oder Ähnlichem gefunden, was ich ja logischerweise erstmal brauche.. Ich finde das echt zum heulen.. Und vor allem gehts mir ja auch um eine Datenbank-Server Geschichte und nicht ner Datenbank-Datei.

Soweit wird mir vll. das Tutorial hier später nach dem Training helfen..
youtube.com/watch?v=MDdkdsG-Yww

— geändert am 07.04.2014, 20:37:12

Antworten
Rob
  • Forum-Beiträge: 33

07.04.2014, 22:50:35 via Website

Okay, die Antwort interpretiere ich jetzt so, dass man aus Android gar nicht auf eine extern ausgelagerte DB zugreifen kann, sondern nur auf die im App Ordner befindliche.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.04.2014, 01:05:53 via App

Doch du kannst auf externe Zugreifen aber wenn du das tust ist die Skriptvariante am besten.
Funktionieren wird die direkte lösung auch aber was soll die 127.0.0.1 in deinem Code oben?
Du brauchst doch die Ip deines Rechners damit dein Handy auf die db dort zugreifen kann.
Aber wenn du das mit einer internen Db machst wird die App nach ausssen hin bzw. nicht im lokalen netz nicht funktionieren

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Rob
  • Forum-Beiträge: 33

08.04.2014, 02:33:29 via Website

Hey, ich hatte die IP nur zeitweilig rausgenommen, geht leider auch mit der korrekten IP nicht.

Ich setz mich morgen nochmal ran..

Habs momentan so gelöst das ich doch die Skriptvariante habe, das zieht aber folgende Konsequenz mit sich:

Ich kann auf meinem Webserver (bezahlter Hoster) auf die Scripts zugreifen und da klappen die Http-Post-Requests an die DB..

Aber sehr umständlich wie ich finde und zusätzlich muss ich dann die komplette DB aus dem SQL Studio auf den Webserver umlagern und dann noch meine schon funktionierende Windows App auf die Scriptgeschichte umbauen :/!..

Das wäre echt fürn A**.. Tschuldigung..

Antworten
SvenDD
  • Forum-Beiträge: 272

08.04.2014, 07:39:04 via Website

Wie willst du sonst auf die Daten von überall zugreifen? Solange du keine feste IP zu Hause hast, musst du ja in deiner App alle 24 Stunden die IP anpassen.

Antworten
Fabian Simon
  • Forum-Beiträge: 359

08.04.2014, 08:01:31 via Website

HI,
also sorry aber das sollte man echt nicht tun !
Niemals direkt von ner App auf nen Globalen Datenbankserver zugreifen!
Das ist sicherheitstechnisch nicht tragbar!
Zumindest bei keiner App die der Breiten masse zugänglich gemacht wird!

Zum anderen ist es aber teoretisch schon möglich.
Jedoch, wie schon gesagt wurde, ist das java spezifisch und hat nicht unbedingt was mit Android zu tun.
Nutzt den Debugger um deine Fehler rauszufinden !
Und geh vielleicht mal für Tests von Teilen der Anwendung weg von Android und mach es in reinem Java.

Gruß
Fabian

Antworten
Rob
  • Forum-Beiträge: 33

08.04.2014, 15:06:10 via Website

Das mit der IP weiß ich doch, aktuell ist es ja auch nur zum testen.

Ne statische IP bzw. ne Weiterleitung zu bekommen wäre ja jetzt nicht das Problem.

Und das Sicherheitsrisiko weiß ich soweit auch.. Die App wird sowieso nicht der breiten Masse gegeben und das Problem liegt einfach darin, dass ich es ja auch schon via PHP versucht habe, bei meinem Webhoster bekomme ich das hin, sprich:

Webhoster-Webspace->PHP->Webhoster-DB->App

Allerdings müsste ich für den oberen Weg meine Windows App die schon funktioniert wieder komplett auf den PHP-Kram umbauen, dass wäre echt beschissen..

Cool wäre es, wenn ich es schaffen könnte, dass das PHP Script was dann zb. bei meinem Hoster oder beim Firmenserver liegen würde auf die Datenbank Remote zugreifen könnte, sprich:

Webhoster-Webspace->PHP->Datenbank auf Server->App

Das habe ich auch schon probiert, aber da möchte die DB die Verbindung nicht erlauben.
Ich hatte es auch schon so probiert Xampp zu benutzen und daraus dann auf meinen SQL Server zuzugreifen, dass möchte er auch nicht.

Da verweigert er die Verbindung :/!

Und wie schon gesagt, ist meine Verbindung überall erreichbar, also der SQL Server (getestet durch die Windows App mit .NET)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.04.2014, 15:14:14 via Website

Du kannst aber auch eine Datenbankschnittstelle für php schreiben und diese dann sowohl für android als auch für .net nutzen.
Wäre das nicht ein Kompromiss?
Jetzt komm icht damit, dass du nicht alles umbauen willst, wenn du programmierst, dann passt dir vieles nicht in den kram aber wenn es funktionieren soll, dann macht man es halt, weil man ja ein gutes Endprodukt haben will.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

08.04.2014, 15:18:02 via Website

Hast du auf dem SQL-Server den Remote-Zugriff freigeschaltet?
Wenn ich mich recht erinnere, geht standardmäßig nur der Zugriff über localhost.

if all else fails, read the instructions.

Antworten
Rob
  • Forum-Beiträge: 33

08.04.2014, 16:17:39 via Website

Hey,

@Pascal: Ja das stimmt an sich schon, aber ist ein ziemlicher Aufwand, da das .NET Produkt ja schon steht, schöner wäre es, wenn die DB so stehen bleiben könnte und das .NET Produkt immer noch so darauf zugreift so wie es bereits ist, nur eben für die Android Variante dann die PHP Schnittstelle wäre, aber dafür müsste ich das zum Laufen bekommen, dass der eben halt aus dem Hoster oder eben halt auch durch meine lokale Xamp Installation via PHP an die DB kommt.

@Klaus: Ja, der sollte an sein, bin mir sehr sicher, schaue gleich nochmal. Ich komme ja mit der .NET App auch von überall dran.
Ich kann mir daher nicht vorstellen das es an was Konfigurationstechnischem liegt.

Siehe soweit das Bild:

Ps: Xampp ist gestartet und mein aktuelles Test-Script sieht so aus (ich hatte die Variablen erstmals aus dem WHERE rausgelassen, in der richtigen Version sind die natürlich drin..:
1<?
2
3$login_id=$_POST["login_id"];
4$login_pw=$_POST["login_pw"];
5
6 $mysqli = new mysqli('localhost','Benutzer','Passwort..','Datenbank');
7 $myArray = array();
8 if ($result = $mysqli->query("SELECT * FROM Mitarbeiter")) {
9 $tempArray = array();
10 while($row = $result->fetch_object()) {
11 $tempArray = $row;
12 array_push($myArray, $tempArray);
13 }
14 echo json_encode($myArray);
15 }
16
17 $result->close();
18 $mysqli->close();
19?>

Welches mir folgende Ausgabe gibt Oo:
query("SELECT * FROM Mitarbeiter)) { $tempArray = array(); while($row = $result->fetch_object()) { $tempArray = $row; array_push($myArray, $tempArray); } echo json_encode($myArray); } $result->close(); $mysqli->close(); ?>

Edit: Ich habe oben noch php vor das "opening-Tag" geschrieben, jetzt wirds scheinbar ausgeführt, allerdings mit Verbindungsfehler:
Kann keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.

Hab aber nochmal die Einstellung gecheckt, er lässt Verbindungen damit zu.
Jetzt könnte es ja ggf. noch an den Ports liegen, weiß nicht ob PHP die selben Ports wie .NET nimmt oder obs irgendwie sonst an den Ports liegt, soweit sind die eig. freigegeben. Also der Server lauscht auf Port 1433..

Hab den Port jetzt mal explizit angegeben und dann kommt ein Timeout :o? Wo dann als Meldung kommt SQL Server has gone away.

Liegt das vll. noch daran das ich ne MSSQL DB hab? Aber mit mssql_connect wills auch nicht, hab Treiber installiert die PHP ini editiert etc...

Ich kack langsam ab :/!!

— geändert am 08.04.2014, 17:52:09

Antworten