[英]How do I generate a JDBC database URL?
我今天已經研究了大約3個小時,我覺得我很接近,但我有幾個問題。 我到目前為止找到的最好的信息來源是: https : //stackoverflow.com/a/2840358 ,但它沒有回答我的所有問題。
一點背景:我正在使用Microsoft SQL Server 2014,並且我已經驗證了IP地址127.0.0.1處於活動狀態並使用端口1433啟用。我在同一台計算機上通過SQL Server程序連接到數據庫沒有問題,但我正在嘗試通過我正在編寫的Java程序進行連接,並且它當前正在發出此錯誤:com.microsoft.sqlserver.jdbc.SQLServerException:端口號1433 / R2M_Database無效。 我對此感到困惑,因為我知道端口1433是正確的,我知道我要連接的數據庫叫做R2M_Database。 現在,這是我的問題以及我的源代碼。
1.)“mysql”和“sqlserver”子協議之間有什么區別,我怎么知道使用哪個? (我很確定我應該使用sqlserver,但以防萬一)
2.)我如何確保使用正確的主機名? (我很確定127.0.0.1 / localhost是我應該使用的那個,但是我怎樣才能從其他機器運行這個程序來訪問數據庫?)
3.)是否存在任何可能導致防火牆或密碼要求的外部問題? (我相當確定用戶名和密碼是正確的,因為它們是我用來在Microsoft SQL Server 2014中成功獲得連接的用戶名和密碼)
編輯:
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);
}
}
}
我做了一個輕微的語法更改(; databaseName =而不是/),現在我收到此錯誤:
com.microsoft.sqlserver.jdbc.SQLServerException:用戶'RSquaredMacro'登錄失敗。 ClientConnectionId:35281a40-0f87-42e4-BC46-b9a81a371529
mysql是一個完全不同的數據庫服務器。 不要將它用於SQL Server。
您需要為數據庫服務器提供公共地址。 只要所有客戶都可以看到它,就可以使用ip或主機名。 如果你沒有,你可以嘗試使用dyndns.org或類似的東西。 請注意,您的客戶仍需要能夠訪問網絡上的服務器(潛在的防火牆問題)。 在不了解您的情況的情況下很難說更多。
防火牆可能是一個問題,但對於localhost來說這不太可能。 我猜測問題在於TCP / IP偵聽器,用戶名,密碼或數據庫名稱設置。
以下鏈接提供了有關構建JDBC連接字符串的更多信息: http : //technet.microsoft.com/en-us/library/ms378428%28v=sql.110%29.aspx
還有一些附注:
您不需要包含1433端口號。
打印整個堆棧跟蹤將幫助您進行調試。 (見下面的代碼)
您應該為Connection聲明一個變量並確保它已關閉。 例:
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) { } }
事實證明,問題在於我的JDBC URL的格式化。 我遇到的問題是不同的子協議具有不同的URL-s語法,但sqlserver協議的語法(以及如何查找每個部分)如下所示:
"jdbc:sqlserver://" + serverName + ";database=" + databaseName
1.)serverName:要查找服務器名稱,請連接到Microsoft SQL Server(這些說明基於SQL Server 2014),然后查看右側的“屬性”窗格。 在頂部的組合框中選擇“當前連接參數”,然后在“服務器名稱”字段的“連接詳細信息”下查找。
2.)databaseName:這個是相當簡單的,因為它是您要從中訪問數據的數據庫的名稱。 即使您登錄的用戶列在“主”數據庫下,您也不必登錄“master”,而是可以使用您想要的任何數據庫,只要您登錄的用戶具有權限即可完成你想要完成的任務。
最后:這是幫助我最終解決問題的鏈接,更詳細地說明了這一點: http : //www.programcreek.com/2010/05/java-code-for-connecting-ms-sql-server-by-使用-SQL服務器的認證/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.