2017-04-04 35 views
1

これで数日間オン/オフして戦ってきたように、関連する検索用語を使い果たしたかのように感じます。私がlotを無駄に研究したと言って始めましょう。私はそれが非常に異常な(あまりありそうもない)か、何とか見落としてしまった非常に小さなものだという結論に達しました。私はアプリから直接データベースに接続することは理想的ではなく、代わりにWebサーバーを使用すべきであることを認識していますが、私の目的と目的では、このソリューションは問題。Android StudioでAzureへのJDBC接続が失敗する

私はこの投稿が超長いことを知っていますが、私はみんなの時間に感謝します。他に何もない場合は、少なくとも、JDBCを使い始めたばかりの人に役立つかもしれませんし、問題に遭遇し始めました。 「私が試したこと」のセクションは、あなたがオンラインで見つけようとしていることの大部分を概説しています。私がやろうとしている何

:JDBCドライバを使用して

、Androidのメーカーを経て、私のAzureでホストされているSQLServerデータベースに接続します。

エラー私が遭遇している:私が試した何

W/System.err: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host vet-to-go.database.windows.net, port 1433 has failed. Error: "Connection timed out: no further information. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.". 

/検証(ショートリスト):

-connectionコードは、しかし、それは中だ、アクティビティクラス内で発生AsyncTask。

-uses許可アンドロイド:名= "android.permission.INTERNETあなた"

-Azureファイアウォールは、私のIPが接続できるように設定されています。

-Windowsファイアウォールは、ポート1433

-from SQLServerのコンフィグマネージャ上の着信&発信トラフィックを許可するように所定の位置にルールを持って、私は名前付きパイプ& TCP/IPを有効にしています。 [IPアドレス]タブでは、すべてを有効にしてTCPポートを1433に設定しました。両方とも&を使用してTCP動的ポートを無効にしてみました。

- 両方ともSQL Server Browserで実行しましたが、&が停止しました(別の記事で述べたように)。

- jre7の両方を使用して試しました& jre8 JDBCドライバ。

-sourceCompatibility & targetCompatibilityはそれぞれ1_7または1_8バージョンで設定されています。

-compileファイル(「LIBS/sqljdbc41.jar」)[またはjre8 42]

は必死に、彼らは問題がなかったことを確認するために、私はまた、Windowsファイアウォールをオンにした後、接続に失敗しましたしました-more (mydbname).database.windowsに

-I できピング&のtelnet - 完全にし、任意のIPは、Azureのファイアウォール(255.255.255.255 0.0.0.0の開始/終了IP)経由で接続することができますオフ。net 1433(DNS &実際のIPアドレス)

上記をすべて考慮すると、エラーは自分のコードのどこかにあると見なすことができますが、私はどこにいるのか分かりません。棺に釘を入れようとすると、でしたので、私のプロジェクトでは&の値を返すことができましたが、は静的な非活動クラスでしか返されません。実際のアクティビティクラスに追加すると、コードをほぼ正確に再現する結果が得られませんでした。私は別のクラスにそれを組み込むことが予想されるので、それだけだ、私はそのコードの一部は奇妙に見える知っ

import java.sql.*; 

public class DatabaseHelper { 

public static void main(String[] args) throws Exception { 
    String custID = "1"; 
    String connectionString = "jdbc:sqlserver://vet-to-go.database.windows.net:1433;database=Vet To Go DB;[email protected];password=myPass;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"; 
    String queryString = "SELECT FirstName, LastName FROM Tbl_Customer WHERE CustomerID = " + custID; 

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
    Connection myConnection = DriverManager.getConnection(connectionString); 
    Statement myStatement = myConnection.createStatement(); 
    ResultSet myResultSet = myStatement.executeQuery(queryString); 

    myResultSet.next(); 
    String firstName = myResultSet.getString("FirstName"); 
    String lastName = myResultSet.getString("LastName"); 

    System.out.println(firstName); 
    System.out.println(lastName); 

    myStatement.close(); 
    myConnection.close(); 
} 

} 

はここ作業コードです。ここではそうすることで私の最新の試みは上記のコードを実行した後

import android.content.Context; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.TextView; 

import java.sql.*; 

public class LandingPage extends AppCompatActivity { 

TextView txtFirst, txtLast; 
String firstName, lastName, customerID; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_landing_page); 
    txtFirst = (TextView)findViewById(R.id.txtFirstName); 
    txtLast = (TextView)findViewById(R.id.txtLastName); 

    customerID = getIntent().getStringExtra("custID"); 

    new myAsyncTask(LandingPage.this).execute(); 

    txtFirst.setText(firstName); 
    txtLast.setText(lastName); 
} 

public class myAsyncTask extends AsyncTask<Void, Void, String> { 
    String connectionString = "jdbc:sqlserver://vet-to-go.database.windows.net:1433;database=Vet To Go DB;[email protected];password=myPass;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"; 
    String queryString = "SELECT FirstName, LastName FROM Tbl_Customer WHERE CustomerID = " + customerID; 
    Context context; 


    public myAsyncTask(Context context) { 
     System.out.println("Async instantiated."); 
     this.context = context; 
    } 
    protected void onPreExecute() { 
     System.out.println("Pre-executing Async task."); 
    } 

    protected String doInBackground(Void... params) { 
     try { 
      System.out.println("Attempting to connect to DB..."); 
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      Connection con = DriverManager.getConnection(connectionString); 
      Statement st = con.createStatement(); 
      ResultSet rs = st.executeQuery(queryString); 

      while (rs.next()) { 
       System.out.println("Sorting through ResultSet..."); 
       firstName = rs.getString("FirstName"); 
       lastName = rs.getString("LastName"); 
      } 

     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return "Complete"; 
    } 

    protected void onPostExecute(String result) { 
     if (result.equals("Complete")) { 
      System.out.println("Async task complete."); 
     } 
    } 
} 
} 

を(私が述べたように、私はしばらくの間、それをしてきた私は、いくつかの異なる組み合わせを試してみたので)ですが、私は得ます「ホストvet-to-go.database.windows.netへのTCP/IP接続、ポート1433は失敗しました。この行でエラー:

Connection con = DriverManager.getConnection(connectionString); 

私はそれが適切だとは思いませんが、念のために、それは、ここですべてのことがMainActivityで、現在ですですされています

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    etID = (EditText)findViewById(R.id.etCustID); 
    btnSubmit = (Button)findViewById(R.id.btnSubmit); 

    btnSubmit.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      customerID = etID.getText().toString(); 
      myIntent = new Intent(MainActivity.this, LandingPage.class); 
      myIntent.putExtra("custID", customerID); 

      startActivity(myIntent); 
     } 
    }); 
} 

のAndroid Studioの2.3

ビルド番号AI-162.3764568、2017年2月24日

JRE:1.8.0_112- AMD64-B06のリリース

JVM:JetBrainsのsro社によってOpenJDKの64ビットサーバーVM

Gradleのバージョン3.3

対象API 22:アンドロイド5.1

分SDK V 21の

ビルドツールv 25.0.0

答えて

0

まず、Azureを直接接続することはお勧めできませんAndroidのSQLデータベース通常、Azure上にWeb AppまたはMobile Appとして作成されるいくつかのREST APIを呼び出すことで、データベースにアクセスすることをお勧めします。

sqljdbcドライバは完全にアンドロイドに対応していませんしているように見えるので、第二に、あなたの同様の問題、回避策ソリューションと既存の多くのSOスレッドは、接続のためにAndroid上jTDSドライバーの代わりに、MS SQL Serverドライバsqljdbcを使用しています。参考として、以下のように解決されたこれらのスレッドを参照してください。

  1. https://social.msdn.microsoft.com/forums/sqlserver/en-US/4799819a-27fd-4292-a3d8-f114207c20b2/using-the-jdbc-driver-with-android
  2. Sql Database connect Using the JDBC Driver with android
  3. how to connect sql server using JTDS driver in Android

それがお役に立てば幸いです。

+0

私は直接接続することが分かっていた記事で言及しましたが、ベストプラクティスではありませんでしたが、この特定のシナリオではそれほど重要ではありません。私はすでにこれを行うC#デスクトップアプリケーションを構築し、直接接続を使用していましたので、一貫性を保ちたいと思います。私はjTDSを使うためにいくつかの提案をしましたが、何か間違っていると思っていたので、私は公式のMSに固執したいと思いました。しかし、実際に私が別にできることがないことが判明した場合、私はその道を行く必要があるでしょう。ありがとう! – Nick

関連する問題