【问题标题】:Can't insert into Sql Server using Spring Framework SimpleJdbcInsert无法使用 Spring Framework SimpleJdbcInsert 插入 Sql Server
【发布时间】:2013-05-09 11:33:05
【问题描述】:

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

    }

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

原因:com.microsoft.sqlserver.jdbc.SQLServerException: 不能 在表'Persons'中为标识列插入显式值 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);
}   

【问题讨论】:

    标签: java sql spring sql-server-2008


    【解决方案1】:

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

    Spring JDBC 模板为每个语句打开一个新连接,这就是为什么您无法在同一会话下设置它的原因。

    //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。

    【讨论】:

    • 好的。虽然我已经解决了我的问题,但我已经尝试了你的代码,是的,它正在工作。谢谢@Marlon Bernardes
    • @Carlos Landeras 太棒了!您的方法的唯一问题是,如果您包含一个新列,则必须将其添加到地图中并作为参数添加到 usingColumns。不过,很高兴知道它正在工作。
    • 是的,在我找到你的答案之前,这是一个临时修复
    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2013-05-04
    • 2022-01-02
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多