Pregunta

intento cargar una tabla que tiene una columna de identidad, la unidad de frenado. Quiero ser capaz de establecer el valor id a mí mismo (no quiero generar la base de datos por mí).

Esta es una definición mínima de mi mesa

create table X (
 id numeric(10,0) IDENTITY PRIMARY KEY NOT NULL
)

Para insertar una línea en X, I ejecute el siguiente SQL

set INDENTITY_INSERT X ON
insert into X(id) VALUES(666)

No hay problema. Pero cuando intento cargar esta tabla con el siguiente conjunto de datos db unidad de XML (RS_7_10_minimal_ini.xml)

<dataset>
 <X id="666"/>
</dataset>

usando el caso de prueba siguiente JUnit mínima (DBTestCase):

package lms.lp.functionnal_config;

import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import lms.DBUnitConfig;
import org.junit.Test;

public class SampleTest extends DBTestCase

{

public SampleTest(String name)

{
    super( name );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, DBUnitConfig.DBUNIT_DRIVER_CLASS );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, DBUnitConfig.DBUNIT_CONNECTION_URL );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, DBUnitConfig.DBUNIT_USERNAME );
    System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, DBUnitConfig.DBUNIT_PASSWORD );

}

protected IDataSet getDataSet() throws Exception

{
    return new FlatXmlDataSetBuilder().build(new FileInputStream("src/test/resources/RS_7_10_minimal_ini.xml"));
}


@Test
public void testXXX() {
        // ...
}
}

Se produce un error con la siguiente excepción

com.sybase.jdbc3.jdbc.SybSQLException: Explicit value specified for identity field in table 'X' when 'SET IDENTITY_INSERT' is OFF.

Parece unidad de frenado no se enciende la identidad EN antes de insertar un registro en el que se especifica el valor de la columna de identidad.

Ya ha intentado ejecutar a mí mismo en la conexión recuperado de la JdbcDataBaseTester pero no hubo suerte. Es probable que una nueva conexión o no la misma conexión utilizan para empujar los datos en de DB.

¿Alguna idea?

Muchas gracias por su ayuda todos!

Octave

¿Fue útil?

Solución

Sí, encontró la solución en el DBUnit FAQ realidad

  

¿Puedo utilizar DbUnit con identidad o columnas de incremento automático?

     

Muchas RDBMSes permiten columnas identidad y auto-incrementos sea implícitamente sobrescriben con los valores del cliente. DbUnit se puede utilizar con estos RDBMS forma nativa. Algunas bases de datos, como MS SQL Server y Sybase, necesidad de activar de forma explícita por escrito los valores del cliente. La forma de activar esta función es específica del proveedor.       DbUnit proporciona esta funcionalidad para MS SQL Server con la clase InsertIdentityOperation.

A pesar de que está escrita para el MS SQL Server, se trabaja también para Sybase. Así que defienda mi conjunto de datos a db con

    new InsertIndentityOperation(DatabaseOperation.CLEAN_INSERT).execute(connection,initialDataSet); 

Et voilà.

Gracias por su rawheiser respuesta.

Otros consejos

No es lo suficientemente familiarizados con DBUnit que le ayude con los detalles; pero he utilizado un truncado mesa y resiembra el valor de identidad en situaciones similares.

dbcc checkident 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top