2015-08-25 78 views
0

我有一個J2EE Web應用程序,它將參數化SQL查詢發佈到MySQL後端。我需要用MS Azure SQL數據庫替換後端。我已將數據庫和數據遷移到MS Azure SQL數據庫。但是,我的所有來自應用程序的查詢都失敗了。例如,下面的查詢(含包裝代碼所示)運行在Management Studio中完全正常,但在Java代碼失敗:從MySQL遷移到MS Azure SQL數據庫

PreparedStatement statement = dbConnection.prepareStatement("SELECT * FROM [mydb].[apps] WHERE [key] = ?;"); 
statement.setString(1, appKey); 
ResultSet resultSet = statement.executeQuery(); 

我得到的錯誤是:

com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'key'. 

我嘗試過各種東西例如刪除[],用列表名限定列名等,但沒有任何作用。

另外還有一個問題:我使用的JDBC連接字符串包括數據庫名稱(mydb),所以我不想將它包含在每個SQL語句中。我從來沒有爲MySQL做過,所以我寧願避免現在這樣做,因爲它會要求我手動將DB名稱添加到代碼中的每個語句。但是,如果我從上述查詢中刪除數據庫名稱,它將再次失敗,並顯示錯誤Invalid object name 'apps'。爲什麼連接字符串中指定的數據庫沒有被用作默認數據庫?我正在使用的連接字符串是jdbc:sqlserver://{servername}.database.windows.net:1433;database=mydb;user={username}@{servername};password={password};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;

順便說一句我正在使用Azure SQL數據庫V12並通過Microsoft JDBC驅動程序4.2連接SQL Server。

+0

where key =?..應該是什麼?表明? 也嘗試刪除';' –

+1

@NaguibIhab,?是下一個語句設置值的佔位符。已刪除「;」後已嘗試過但沒有幫助。 – Santosh

+0

這是一個不知道它是否會工作的通配符,試試這個查詢:'SELECT * FROM apps WHERE key = 1' –

回答

0

我試圖重現您的問題,但我的示例代碼運行良好。根據我的經驗,我認爲問題的原因是通過使用不正確的表名形式。

MSSQL表名完成格式爲<db_name>。 <owner_name>。 <table_name>。其簡稱可能是<owner_name>。 <table_name>或<table_name>。該項目可以是<項目>或[<項目>]。

示例代碼(用於Azure的SQL數據庫,相同的原則,MSSQL在Azure VM):

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

public class Test { 

    public static void main(String[] args) throws SQLException, ClassNotFoundException { 
     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     String jdbcUrl = "jdbc:sqlserver://<host_name>:1433;database=<db_name>;"; 
//The completed connection string is jdbc:sqlserver://<host_name>:1433;database=<db_name>;user=<user like [email protected]_name>;password={your_password_here};encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30; 
     String user = "<user>"; 
     String password = "<password>"; 
     Connection conn = DriverManager.getConnection(jdbcUrl, user, password); 
     String sql = "SELECT * FROM person WHERE name = ?;" // My test table is 'person' 
// The table name could be person, [person], dbo.person, [dbo].[person], <db_name>.dbo.person, [<db_name>].[dbo].[person] 
     PreparedStatement statement = conn.prepareStatement(sql); 
     statement.setString(1, "Peter Pan"); 
     ResultSet rs = statement.executeQuery(); 
     while(rs.next()) { 
      System.out.println(rs.getLong("id")+","+rs.getString("name")); 
     } 
    } 
} 

我建議你使用第三方的通用數據庫管理工具「Dbeaver」。它基於Eclipse並使用JDBC Driver連接各種數據庫包括MSSQL。您可以在Azure VM上創建與MSSQL的數據庫連接並測試SQL查詢。

最好的問候。