Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JDBC&;Microsoft SQL Server/如何设置AllowMultipleQuery_Sql_Sql Server_Jdbc - Fatal编程技术网

JDBC&;Microsoft SQL Server/如何设置AllowMultipleQuery

JDBC&;Microsoft SQL Server/如何设置AllowMultipleQuery,sql,sql-server,jdbc,Sql,Sql Server,Jdbc,如何为Microsoft SQL Server在JDBC上设置AllowMultipleQuery 我的连接字符串当前在后面,但不起作用 private final String url = "jdbc:sqlserver://localhost:11435;databaseName=myDatabase;allowMultiQueries=true"; 为什么不改用存储过程呢?与其设置allowmultiquerys,不如使用如下所示的存储过程 create procedure usp_da

如何为Microsoft SQL Server在JDBC上设置AllowMultipleQuery

我的连接字符串当前在后面,但不起作用

private final String url = "jdbc:sqlserver://localhost:11435;databaseName=myDatabase;allowMultiQueries=true";

为什么不改用存储过程呢?与其设置
allowmultiquerys
,不如使用如下所示的存储过程

create procedure usp_data
as
begin
INSERT INTO ......; 
SELECT @@IDENTITY AS [id];
end

现在从代码后面调用该存储过程。如果需要,还可以参数化该过程。使用Microsoft的JDBC驱动程序for SQL Server,您无需向连接URL添加任何特殊内容,即可在一个
执行
中启用多个语句。这很好:

connectionUrl=“jdbc:sqlserver://localhost:52865;databaseName=myDb”;
try(Connection conn=DriverManager.getConnection(connectionUrl、myUserID、myPassword)){
System.out.printf(“驱动程序版本%s%n”,conn.getMetaData().getDriverVersion());
try(语句st=conn.createStatement()){
st.execute(“创建表#测试(id INT-IDENTITY主键,textcol-NVARCHAR(50))”;
}
字符串[]itemsToInsert=新字符串[]{“foo”,“bar”};
字符串sql=
“不计数;”+
“插入到#测试(textcol)值(?)”+
“选择@@IDENTITY;”;
try(PreparedStatement ps=conn.prepareStatement(sql)){
for(字符串项:itemsToInsert){
ps.setString(1,项目);
try(ResultSet rs=ps.executeQuery()){
rs.next();
int newId=rs.getInt(1);
System.out.printf(“%s”插入,id=%d%n”,项,newId);
}
}
}
}捕获(例外e){
e、 printStackTrace(System.err);
}
生产

驱动程序版本6.0.7728.100
插入id为1的“foo”
插入id为2的“条”
但是,在这种特殊情况下,最好使用JDBC的内置支持来检索生成的密钥:

String sql=“插入测试(textcol)值(?);
try(PreparedStatement ps=conn.PreparedStatement(sql,PreparedStatement.RETURN\u生成的\u键)){
for(字符串项:itemsToInsert){
ps.setString(1,项目);
ps.executeUpdate();
try(ResultSet rs=ps.getGeneratedKeys()){
rs.next();
int newId=rs.getInt(1);
System.out.printf(“%s”插入,id=%d%n”,项,newId);
}
}
}

产生完全相同的结果。

为什么不使用存储过程呢?我需要执行:插入到。。。。。。;选择@@IDENTITY作为[id];使用
getGeneratedKeys()
和您的
PreparedStatement
我尝试了它,但不起作用:-(结果是1,不是最新的id。
allowMultiQueries
是MySQL特有的。不要期望一个数据库系统/驱动程序的非标准功能完全相同(甚至完全可用)另一方面,我不喜欢这个解决方案,因为我经常使用@IDENTITY,每次使用时,我都需要创建新的过程:-/是否存在另一个获取最新id的好解决方案?@steelbull,不,您不需要创建新的过程,但需要调用该过程,而不是多个临时查询thx@Rahul。多个查询绝对不支持关于JDBC for MSSQL的ed?感谢您提供的详细示例和评论,这应该被接受为答案