2015-08-25 44 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查询。

最好的问候。