簡體   English   中英

從MySQL遷移到MS Azure SQL數據庫

[英]Moving from MySQL to MS Azure SQL Database

我有一個J2EE Web應用程序,它向MySQL后端發出參數化的SQL查詢。 我需要用MS Azure SQL數據庫替換后端。 我已將數據庫和數據遷移到MS Azure SQL數據庫。 但是,我從該應用程序發出的所有查詢均失敗。 例如,以下查詢(與包裝代碼一起顯示)在Management Studio中運行正常,但在Java代碼中失敗:

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做過,所以我現在寧願避免這樣做,因為這將需要我手動將數據庫名稱添加到代碼中的每個語句中。 但是,如果我從上述查詢中刪除了數據庫名稱,則它再次失敗,並顯示錯誤的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,並通過用於SQL Server的Microsoft JDBC驅動程序4.2進行連接。

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

MSSQL表名稱完成的形式為<db_name>。<owner_name>。<table_name>。 它的縮寫形式可以是<owner_name>。<table_name>或<table_name>。 該項目可以是<item>或[<item>]。

示例代碼(對於Azure SQL數據庫,與Azure VM上的MSSQL相同的原理):

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 username@server_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驅動程序來連接包括MSSQL在內的各種數據庫。 您可以在Azure VM上創建與MSSQL的數據庫連接並測試SQL查詢。

最好的祝福。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM