gpt4 book ai didi

java - 无法使用 Spring Framework SimpleJdbcInsert 插入到 Sql Server

转载 作者:行者123 更新时间:2023-11-30 09:22:33 30 4
gpt4 key购买 nike

我正在尝试使用 JDBC Spring 框架在 Sql Server 2008 中插入一行:

代码如下:

BdClass bdclass= new BdClass(BdClass.BdConfig.ConnectionString_MYHOME);
Person personaNueva = new Person();
personaNueva.setIdPerson(5);
personaNueva.setUsuario("JavaUser");
personaNueva.setClave("JavaPassword");
personaNueva.setNombre("JavaNombreUsuario");
personaNueva.setActivo("S");
personaNueva.AddPerson(bdclass);


//Person class

public void AddPerson(BdClass bdclass)
{
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(Constantes.idperson, this.getIdperson());
parameters.put(Constantes.usuario,this.getUsuario());
parameters.put(Constantes.clave,this.getClave());
parameters.put(Constantes.nombre,this.getNombre());
parameters.put(Constantes.activo, this.getActivo());
bdclass.Insert(parameters,Constantes.Table_Name);
}

//BdClass Insert

In this step I am enabling IDENTITY INSERT

public void Insert(Map<String, Object> parameters, String TableName)
{
this.jdbcTemplate.execute("SET IDENTITY_INSERT " + TableName + " ON");
JdbcInsert = new SimpleJdbcInsert(this.jdbcTemplate).withTableName(TableName);
JdbcInsert.execute(parameters);

}

运行执行语句时出现以下异常:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert explicit value for identity column in table 'Persons' when IDENTITY_INSERT is set to OFF

我已经在 sql management studio 中尝试了命令 SET IDENTITY_INSERT PERSONS ON 但没有成功。

编辑:idperson 字段是身份,但是我是否传递参数和值并不重要......我得到了同样的错误

编辑 2:

好的,我使用 usingColumns 属性修复了它,所以我可以指定每一列:

public void Insert(Map<String, Object> parameters, String TableName)
{
this.jdbcTemplate.execute("SET IDENTITY_INSERT " + TableName + " OFF");
JdbcInsert = new SimpleJdbcInsert(this.jdbcTemplate).withTableName(TableName)
.usingColumns(Person.Constantes.usuario,Person.Constantes.clave,
Person.Constantes.nombre,Person.Constantes.activo);

JdbcInsert.execute(parameters);
}

最佳答案

SQL Server 的SET IDENTITY 是 session 范围的。这意味着您必须在用于插入数据的同一事务下执行命令 SET IDENTITY_INSERT "+ TableName + "ON"

Spring JDBC 模板为每个语句打开一个新连接,这就是为什么您不能在同一 session 下设置它。

//connection opened --> statement executed --> connection closed
this.jdbcTemplate.execute("SET IDENTITY_INSERT " + TableName + " ON");

我认为最好的方法不是打开 IDENTITY_INSERT 并执行以下操作:

public void Insert(Map<String, Object> parameters, String TableName)
{
JdbcInsert = new SimpleJdbcInsert(this.jdbcTemplate).withTableName(TableName);
//This column won't be included on the insert statement (it will be autogenerated by SQL Server)
JdbcInsert.setGeneratedKeyName("id");
JdbcInsert.execute(parameters);
}

另一种选择是在同一事务下执行这两个语句,但我认为您不能为此使用 SimpleJdbcInsert。

关于java - 无法使用 Spring Framework SimpleJdbcInsert 插入到 Sql Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16460791/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com