JDBC&;Microsoft SQL Server/如何设置AllowMultipleQuery
如何为Microsoft SQL Server在JDBC上设置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
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?感谢您提供的详细示例和评论,这应该被接受为答案