我有一个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做过,所以我现在宁愿避免这样做,因为它需要我手动将DB名称添加到代码中的每个语句。但是,如果我从上面的查询中删除了数据库名称,它将再次失败,并显示错误Invalid object name 'apps'
。为什么连接字符串中指定的DB不是默认值?我使用的连接字符串是jdbc:sqlserver://{servername}.database.windows.net:1433;database=mydb;user={username}@{servername};password={password};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
BTW我正在使用Azure SQL数据库V12并通过Microsoft JDBC Driver 4.2连接SQL Server。
答案 0 :(得分:0)
我尝试重现您的问题,但我的示例代码运行正常。根据我的经验,我认为问题的原因是使用了错误的表名形式。
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"));
}
}
}
我建议您使用第三方通用数据库管理工具&#34; Dbeaver&#34;。它基于Eclipse并使用JDBC Driver连接各种Database包括MSSQL。您可以在Azure VM上创建与MSSQL的数据库连接并测试SQL查询。
最诚挚的问候。