2

jTDS-1.2.5 を使用して SQL サーバー上のデータベースに接続しようとしています。これが危険で安全でないことはわかっています。このようにするべきではありませんが、試してみたいだけなので、冗談を言ってください。jTDS をテストするために、netbeans で次のコードを書きました。

package dbconnecttest;

import java.sql.*;
import net.sourceforge.jtds.jdbc.*;
import net.sourceforge.jtds.jdbcx.*;

public class DBConnectTest {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    Connection con = null;
    try {
        Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();

        String connString = "jdbc:jtds:sqlserver://MY_SERVER_NAME:24923/Phone_Test;user=testLogin;password=xxxxxxxx;instance=MYINSTANCE";
        con = DriverManager.getConnection(connString,"testLogin","xxxxxxxx");
        try {
            PreparedStatement stmt = con.prepareStatement("SELECT * FROM Product_Inventory_Test WHERE ProductTest = 'Car'");
            stmt.execute();

            ResultSet rs = stmt.getResultSet();
            while (rs.next()) {
                System.out.println(rs.getString("ProductTest").replace(" ", "") + " price: $" + rs.getString("PriceTest"));
            }
            stmt.close();
        } catch (Exception e) {
            System.out.println("Statement error: " + e.getMessage());
        }
        con.close();


    }
    catch (Exception e) {
        System.out.println("Connection Error: " + e.getMessage());
    }

}
}

1433 以外のポートに接続していることに注意してください。構成マネージャーで TCP/IP を有効にし、すべての IP アドレスの TCP ポートを 24923 に設定しました。また、TCP ポートが動的に割り当てられていないことも確認しました。このコードは netbeans で正常に動作し、問題なくデータベースからデータを取得します。AndroidアプリのEclipseで同様のコードを使用しています:

package com.xxxxxx.xxxxxx;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import net.sourceforge.jtds.jdbc.*;
import net.sourceforge.jtds.jdbcx.*;


public class LoginActivity extends Activity {

TextView labelLogin;
TextView labelError;
EditText txtUsername;
EditText txtPassword;
Button btnLogin;


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

    //Assign properties to login form views
    labelLogin = (TextView)findViewById(R.id.labelLogin);
    labelError = (TextView)findViewById(R.id.labelError);
    txtUsername = (EditText)findViewById(R.id.txtUsername);
    txtPassword = (EditText)findViewById(R.id.txtPassword);
    btnLogin = (Button)findViewById(R.id.btnLogin);
}

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

@SuppressWarnings("deprecation")
public void login_onClick(View view) {
    Connection con = null;
    try{
        Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();



        String connString = "jdbc:jtds:sqlserver://MY_SERVER_NAME:24923/Phone_Test;user=testLogin;password=xxxxxxxx;instance=MYINSTANCE";
        String username = "testLogin";
        String password = "xxxxxxxx";
        con = DriverManager.getConnection(connString,username,password);
        PreparedStatement stmt = null;
        try {
            //Prepared statement
            stmt = con.prepareStatement("SELECT * FROM Logins WHERE Username = ? AND Password = ?");
            stmt.setString(1, txtUsername.toString());
            stmt.setString(2, txtPassword.toString());
            stmt.execute();

            ResultSet rs = stmt.getResultSet();
            if(rs.next()) {
                //Start new activity
                AlertDialog ad = new AlertDialog.Builder(this).create();
                ad.setTitle("Success!");
                ad.setMessage("You have logged in successfully!");
                ad.setButton("OK", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();

                    }
                });
                ad.show();




            }
            stmt.close();
        }
        catch (Exception e) {
            stmt.close();
            AlertDialog ad = new AlertDialog.Builder(this).create();
            ad.setTitle("Error");
            ad.setMessage("Prepared statement error: " + e.getMessage());
            ad.setButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            });
            ad.show();
        }
        con.close();
    }
    catch (Exception e) {
        AlertDialog ad = new AlertDialog.Builder(this).create();
        ad.setTitle("Error");
        ad.setMessage("Connection error: " + e.getMessage());
        ad.setButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();

            }
        });
        ad.show();
    }
}

}

jar ファイルをクラスパスに追加しましたが、すべて正常に動作しているようです。ただし、エミュレーターでアプリを実行すると、次のエラーが表示されます。

Connection Error: Unable to get information from SQL Server: MY_SERVER_NAME.

私は次に何をすべきかについてちょっと立ち往生しています。すべて正常に動作しているように見えますが、接続できません。コマンドプロンプトに移動してsqlcmd -Lを試してみましたが、リストにサーバーが含まれています。そこから自分のサーバーに telnet で接続することもできます。netstat -an は、ポート 24923 でローカル IP アドレス 0.0.0.0 をリッスンしていることを示しています。何が問題なのかわからないので、このエラーの解決に関する jTDS FAQ のヒントを既に確認しました。アイデア/提案はありますか?

4

0 に答える 0