2014-07-01 16 views
5

Badam to przez około 3 godziny dzisiaj i czuję, że jestem blisko, ale mam kilka pytań. Najlepsze źródło informacji, które znalazłem do tej pory, znajduje się tutaj: https://stackoverflow.com/a/2840358, ale nie odpowiada na wszystkie moje pytania.Jak wygenerować adres URL bazy danych JDBC?

Nieco tła: używam Microsoft SQL Server 2014 i sprawdziłem, czy adres IP 127.0.0.1 jest aktywny i włączony z portem 1433. Nie mam problemów z łączeniem się z bazą danych za pomocą programu SQL Server na tym samym komputerze, ale próbuję połączyć się za pomocą napisanego przeze mnie programu Java, który obecnie podaje ten błąd: com.microsoft.sqlserver.jdbc.SQLServerException: Numer portu 1433/R2M_Database jest niepoprawny. Jestem tym zdezorientowany, ponieważ wiem, że port 1433 jest poprawny i wiem, że baza danych, z którą chcę się połączyć, nazywa się R2M_Database. Oto moje pytania wraz z moim kodem źródłowym.

1.) Jaka jest różnica między podkategoriami "mysql" i "sqlserver" i skąd mam wiedzieć, które z nich należy zastosować? (Jestem prawie pewien, że mam używać sqlserver, ale na wszelki wypadek)

2.) Jak mogę zapewnić, że używam właściwej nazwy hosta? (Jestem prawie pewien, że 127.0.0.1/localhost jest tym, którego mam używać, ale jak będę mógł uruchomić ten program z innych maszyn, aby uzyskać dostęp do bazy danych?)

3.) Czy są jakieś zewnętrzne problemy, które mogą powodować takie problemy, jak zapory ogniowe lub hasła? (Jestem prawie pewna, że ​​nazwa użytkownika i hasło są poprawne, jak to oni używam z powodzeniem uzyskać połączenie w Microsoft SQL Server 2014)

EDIT:

import java.sql.DriverManager; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import org.apache.ibatis.jdbc.ScriptRunner; 

public class SQLTest { 
    public static void main(String[] args){ 
     String script = "CreatePersons.sql"; 
     try { 
      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
      new ScriptRunner(DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=R2M_Database", userName, password)) 
        .runScript(new BufferedReader(new FileReader(script))); 
     } catch (Exception e) { 
      System.err.println(e); 
     } 
    } 
} 

Zrobiłem małą zmianę składni (; databaseName = zamiast /), a teraz otrzymuję ten błąd:

com.microsoft.sqlserver.jdbc.SQLServerException: Logowanie nie powiodło się dla użytkownika "RSquaredMacro". ClientConnectionId: 35281a40-0f87-42e4-bc46-b9a81a371529

+0

Jeśli występują problemy z połączeniem, najprawdopodobniej problemem jest to, że nie zostały jeszcze włączone TCP/IP listener na porcie 1433. Szybkie polecenie "netstat -an" powie Ci, czy go słuchasz. Sprawdź i skomentuj, co dostałeś ??? –

+0

To jest to, co otrzymałem, gdy zrobiłem "netstat -an": [Obraz logu] (http://i.imgur.com/vjh2LZO) – user1654889

+0

Jak na rysunku, nr portu. 1433 nasłuchuje.Tak, to wcale nie jest problem! –

Odpowiedz

3
  1. mysql jest zupełnie inny serwer bazy danych. Nie używaj go do SQL Server.

  2. należy podać publiczny adres serwera bazy danych. albo ip, albo nazwa hosta jest w porządku, o ile widzą ją wszyscy twoi klienci. jeśli go nie masz, możesz spróbować użyć dyndns.org lub czegoś podobnego. Uwaga: Twoi klienci nadal będą musieli mieć dostęp do serwera w sieci (potencjalne problemy z firewallem). Trudno powiedzieć więcej, nie wiedząc więcej o twojej sytuacji.

  3. Zapora może być problemem, ale jest to mało prawdopodobne w przypadku localhost. Zgaduję, że problem dotyczy odbiornika TCP/IP, nazwy użytkownika, hasła lub ustawień nazwy bazy danych.

Oto link z większą ilością informacji o budowaniu ciąg połączenia JDBC: http://technet.microsoft.com/en-us/library/ms378428%28v=sql.110%29.aspx

Również niektóre notatki niepożądane:

  1. Nie muszą zawierać numer portu 1433.

  2. drukowanie całego śledzenia stosu pomoże ci w debugowaniu. (patrz poniżej)

  3. należy zadeklarować zmienną dla połączenia i upewnić się, że zostanie ona zamknięta. Przykład:

    Connection c = null; 
    try { 
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
        c = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433/R2M_Database", userName, password); 
        new ScriptRunner(c).runScript(new BufferedReader(new FileReader(script))); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } finally { 
        if (c != null) try { c.close(); } catch (Exception e) { } 
    } 
    
+0

Dzięki za pomoc, zajrzę na dyndns.org. Port, którego szukam, wydaje się być podsłuchiwany na podstawie polecenia netstat -an, które uruchomiłem. Przejrzałem jeszcze trochę dokumentacji i wykonałem edycję, która sprawia, że ​​twoja teoria hasła/nazwy użytkownika wydaje się prawdopodobna, ale już dziś użyłem tego hasła i nazwy użytkownika. – user1654889

+0

Czy w haśle są znaki specjalne (szczególnie ukośnik odwrotny)? Spróbuj wykonać 'System.err.println (" passwd = "+ hasło)', aby potwierdzić wartość. – Barett

+0

Hasło wydrukowane poprawnie. Jest to ciąg cyfr i liter bez znaków specjalnych. – user1654889

0

Okazuje się, że problemem było w formatowaniu mojego JDBC URL. Problemem było to, że różne subprotocols mają różne składnie dla ich URL-ów, ale składnia dla protokołu sqlserver (i jak znaleźć każdą część) znajduje się na liście poniżej:

"jdbc:sqlserver://" + serverName + ";database=" + databaseName 

1.) ServerName: Aby znaleźć nazwę twojego serwera, połącz się z Microsoft SQL Server (te instrukcje są oparte na SQL Server 2014) i spójrz na okienko "Właściwości" po prawej stronie. Wybierz "Aktualne parametry połączenia" w polu kombi na górze i sprawdź w "Szczegóły połączenia" pola "Nazwa serwera".

2.) databaseName: Ten jest dość prosty, ponieważ jest to nazwa bazy danych, z której chcesz uzyskać dostęp do danych. Nawet jeśli użytkownik, do którego się logujesz, jest wymieniony w bazie danych "master", nie musisz logować się do "master", ale możesz użyć dowolnej bazy danych, o ile użytkownik, do którego się logujesz, ma pozwolenie wykonać zadania, które chcesz wykonać.

Wreszcie: tu jest link, który pomógł mi w końcu rozwiązać mój problem, który przechodzi w bardziej szczegółowo: http://www.programcreek.com/2010/05/java-code-for-connecting-ms-sql-server-by-using-sql-server-authentication/

Powiązane problemy