Java 在指定的MSSQL架构中创建视图
我使用的是ApacheTomcat7.0.41,需要在SQLServer2012上生成一个带有官方“com.microsoft.sqlserver.jdbc.SQLServerDriver”驱动程序的视图。 不幸的是,选择模式似乎有问题。我试过几种方法来实现它,但每次都失败了 奇怪的是,定期创建表不会引起任何问题:Java 在指定的MSSQL架构中创建视图,java,sql-server,jdbc,view,database-schema,Java,Sql Server,Jdbc,View,Database Schema,我使用的是ApacheTomcat7.0.41,需要在SQLServer2012上生成一个带有官方“com.microsoft.sqlserver.jdbc.SQLServerDriver”驱动程序的视图。 不幸的是,选择模式似乎有问题。我试过几种方法来实现它,但每次都失败了 奇怪的是,定期创建表不会引起任何问题: CREATE TABLE Defschem.dbo.Formate ( [FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, [I
CREATE TABLE Defschem.dbo.Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
尝试以相同的方式查看。
(仅供参考:语句本身和表名都是分开的最终字符串
,可以单独更改)
:
失败,错误为:
com.microsoft.sqlserver.jdbc.SQLServerException:“创建/更改视图”
不允许将数据库名称指定为对象的前缀
姓名。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) 保留数据库名称会将创建的视图完全放在“master”数据库中,这并不是我想要的 该错误很常见,提示: 要避免此错误,请在创建视图时删除数据库名称: […]如果需要在另一个数据库上创建视图,请更改 首先创建数据库,然后创建不带数据库名称的视图: 我用以下命令启动了整个SQL命令:
"USE " + DATABASENAME + '\n' + "GO " + '\n';
致:
它将获得以下错误:
com.microsoft.sqlserver.jdbc.SQLServerException:附近语法不正确
“走”
我不确定我的'\n'对于SQL Server是否不够漂亮。。。我不明白为什么语法不正确,所以我将整个SQL插入了SQL Management Studio。。。成功了
我很难理解为什么一个相同的命令可以在Studio中工作,但如果用Java执行就不行了?
该命令是直接的(我使用常规语句而不是准备好的语句,因为我不插入任何值,所有字符串都是最终的):
官方文档(参见“示例”部分)指的是在GO模式之后使用分号的情况。
但改变为:
"USE " + DATABASENAME + ";\n" + "GO " + '\n';
给了我完全相同的错误。离开“\n”也没有效果
不久前似乎有人遇到了类似的问题:
我以前没有研究过同义词,我认为这不是解决我问题的正确方法。有更优雅的解决方案吗
谢谢您可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
可以将数据库名称指定为连接字符串的一部分。这意味着您不需要
USE
语句,因为连接字符串中的数据库是您当前的数据库
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
一旦连接到数据库,就不需要在SQL中使用它。您也不需要使用模式名-dbo是SQL Server中的默认模式,您可以不使用它
例如:
String connectionUrl = "jdbc:sqlserver://servername:1433;databaseName=TheActualDatabaseName;user=UserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
CREATE TABLE Formate (
[FormatID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Info] [varchar](50) NOT NULL UNIQUE,
[FVal] [float] NOT NULL)
)
像
USE
这样的语句在技术上可以在JDBC中使用。但是,不能使用GO
,因为这不是SQL Server T-SQL语法的一部分;它实际上是SQLServerManagementStudio和许多SQLServer脚本工具的一部分
但是,JDBC强烈反对直接使用影响连接状态的命令(包括其他命令,如事务(启动、提交回滚)):
注意:配置连接时,JDBC应用程序应使用适当的连接方法,如setAutoCommit
或setTransactionIsolation
。当存在可用的JDBC方法时,应用程序不应直接调用SQL命令来更改连接的配置。(来自)
如果要切换数据库,可以使用。这样,连接就知道它现在已连接到其他目录。如果您使用USE
执行此操作,则驱动程序可能仍然认为它已连接到初始数据库,并执行错误的操作(例如为错误的数据库缓存元数据等)
当然,另一个选项如中所述:直接连接到正确的数据库。像USE
这样的语句在技术上可以在JDBC中使用。但是,不能使用GO
,因为这不是SQL Server T-SQL语法的一部分;它实际上是SQLServerManagementStudio和许多SQLServer脚本工具的一部分
但是,JDBC强烈反对直接使用影响连接状态的命令(包括其他命令,如事务(启动、提交回滚)):
注意:配置连接时,JDBC应用程序应使用适当的连接方法,如setAutoCommit
或setT