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

时间:2013-05-09 11:33:06

标签: java sql spring sql-server-2008

我正在尝试使用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
  

在此步骤中,我启用了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); 

    }

运行execute语句时,我收到以下异常:

  

引起:com.microsoft.sqlserver.jdbc.SQLServerException:不能   在表'Persons'中为identity列插入显式值   IDENTITY_INSERT设置为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);
}   

1 个答案:

答案 0 :(得分:2)

SQL Server的SET IDENTITY是会话作用域。这意味着您必须在用于插入数据的同一交易下执行命令SET IDENTITY_INSERT " + TableName + " ON"

Spring JDBC Template为每个语句打开一个新连接,这就是为什么你无法在同一个会话中设置它。

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

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

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。