3

私は現在、データをMSSQL Server 2008に同期することになっているAndroid用のアプリケーションを作成しています。これまでに行ったことがないため、現在、それを機能させる方法をテストしています。会社はデバイスをネットワークに登録したくないので、デバイスはWiFi経由ではなくUSBポートに接続されているときはいつでも同期することに注意してください。

これまでのところ、これはJavaをSQLServerに接続するために私が取り組んだことです。これは単純なSelectコードです(私は現在SQLExpressを使用してテストしています):

  String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;" +
             "databaseName=Android;integratedSecurity=true;";

  // Declare the JDBC objects.
  Connection con = null;
  Statement stmt = null;
  ResultSet rs = null;

  try {
     // Establish the connection.
     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
     con = DriverManager.getConnection(connectionUrl);

     // Create and execute an SQL statement that returns some data.
     String SQL = "SELECT * FROM AndroidTest;";
     stmt = con.createStatement();
     rs = stmt.executeQuery(SQL);

     // Iterate through the data in the result set and display it.
     while (rs.next()) {
        System.out.println(rs.getString(1) + " " + rs.getString(2));
     }
  }

  // Handle any errors that may have occurred.
  catch (Exception e) {
     e.printStackTrace();
  }
  finally {
     if (rs != null) try { rs.close(); } catch(Exception e) {}
     if (stmt != null) try { stmt.close(); } catch(Exception e) {}
     if (con != null) try { con.close(); } catch(Exception e) {}
  }

今、私はAndroidで同じことを試しましたが、これは次のようになります。

package com.example.testsqlserver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void clickSend(View view) {
        (new Thread(new TestThread())).start();
    }
    public class TestThread extends Thread {
      public void run() {
          String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;" +
                     "databaseName=Android;integratedSecurity=true;";

          // Declare the JDBC objects.
          Connection con = null;
          Statement stmt = null;

          try {
             // Establish the connection.
             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
             con = DriverManager.getConnection(connectionUrl);

             //Get information from EditText
             EditText txtTest = (EditText)findViewById(R.id.txtTest);
             EditText txtName = (EditText)findViewById(R.id.txtName);
             String test = txtTest.getText().toString();
             String name = txtName.getText().toString();

             // Create and execute an SQL statement that returns some data.
             String SQL = "INSERT INTO AndroidTest VALUES('" + test + "', '" + name + "');";
             stmt = con.createStatement();
             stmt.executeUpdate(SQL);
             Log.e("Success", "Success");
          }

          // Handle any errors that may have occurred.
          catch (Exception e) {
             e.printStackTrace();
              Log.e("Error", e.toString());
          }
          finally {
             if (stmt != null) try { stmt.close(); } catch(Exception e) {}
             if (con != null) try { con.close(); } catch(Exception e) {}
          }
      }

      public void main(String args[]) {
          (new TestThread()).start();
      }
    }
}

最初の例では完全に機能しますが、2番目の例では次のエラーが発生します。

12-17 20:15:12.589:E / Error(1668):com.microsoft.sqlserver.jdbc.SQLServerException:ホスト127.0.0.1、ポート1433へのTCP/IP接続に失敗しました。エラー:「403ms後に/127.0.0.1(ポート1433)に接続できませんでした:isConnectedが失敗しました:ECONNREFUSED(接続が拒否されました)。接続プロパティを確認し、SQL Serverのインスタンスがホストで実行されており、TCP/IP接続を受け入れていることを確認してくださいポートで、ファイアウォールがポートへのTCP接続をブロックしていないこと。」

最初のコードを初めて実行したときにこのエラーが発生し、SQLServer設定でポート1433を有効にする必要がありました。しかし、なぜそれが2番目のテーブルで機能しないのかわかりません。これは同じコードですが、唯一の違いは、ボタンを押すだけで実行されることと、別のスレッドで実行されることです。

どんな助けでもありがたいです、ありがとう。

4

1 に答える 1

5

EmulatorNetorkingに関するこのセクションを参照してください。

10.0.2.2を使用する必要があります。これにより、エミュレーターから開発マシンの127.0.0.1アドレスに通信できます。

また、ポートリダイレクションを行う必要がある場合もあります(そのドキュメントの詳細を参照してください)。

于 2012-12-17T20:27:40.417 に答える