Подключение к серверу MS SQL с помощью jTDS на Android

Я пытаюсь подключиться к базе данных на сервере sql, используя jTDS-1.2.5. Я знаю, что это опасно и небезопасно, и мне не следует поступать таким образом, но я просто хочу попробовать, так что поддержите меня. Чтобы протестировать 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 в диспетчере конфигурации и установил TCP-порт для всех IP-адресов на 24923. Я также убедился, что он не назначает TCP-порты динамически. Этот код отлично работает в netbeans и без проблем извлекает данные из базы данных. Я использую аналогичный код в eclipse в своем приложении для Android:

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, и в списке есть мой сервер. Я также могу подключиться к своему серверу оттуда. netstat -an показывает, что он прослушивает порт 24923 с локальным IP-адресом 0.0.0.0. Я просто не уверен, в чем проблема, и я уже проверил советы по jTDS FAQ по устранению этой ошибки. Есть идеи/предложения?


person Kyle    schedule 23.05.2013    source источник
comment
Я понял. Для тех, кто имеет дело с подобной проблемой, я не совсем уверен, что я сделал, чтобы исправить это, но вот несколько предложений: Обновите до jtds 1.2.7, но НЕ 1.3.0. Кроме того, в строке подключения опустите часть экземпляра.   -  person Kyle    schedule 06.06.2013