2

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: IDENTITY_INSERT が OFF に設定されている場合、テーブル 'Persons' の ID 列に明示的な値を挿入できません

私はすでにSQL管理スタジオでSET IDENTITY_INSERT PERSONS ONコマンドを試しましたが、うまくいきませんでした。

編集: idperson フィールドは identityですが、パラメーターと値を渡すかどうかは関係ありません...同じエラーが発生します

編集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);
}   
4

1 に答える 1

2

SQL ServerSET 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);
} 

もう 1 つの方法は、同じトランザクションで両方のステートメントを実行することですが、そのために SimpleJdbcInsert を使用できるとは思いません。

于 2013-05-09T12:12:14.980 に答える