Pergunta

Eu tento carregar uma tabela, que possui uma coluna de identidade, com unidade de banco de dados. Quero poder definir o valor do ID (não quero que o banco de dados o gerem para mim).

Aqui está uma definição mínima da minha mesa

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

Para inserir uma linha em x, eu executo o seguinte SQL

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

Sem problemas. Mas quando tento carregar esta tabela com o seguinte conjunto de dados da unidade db xml (rs_7_10_minimal_ini.xml)

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

Usando o seguinte caso de teste mínimo de Junit (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() {
        // ...
}
}

Falha com a seguinte exceção

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

Parece que a unidade de banco de dados não liga a identidade antes de inserir uma linha para a qual o valor da coluna de identidade é especificado.

Eu já tentei me executar na conexão recuperada do jdbcdatabaseTester, mas sem sorte. Provavelmente uma nova conexão ou não a mesma conexão usada para empurrar os dados para o DB.

Qualquer ideia?

Muito obrigado pela sua ajuda a todos!

Oitava

Foi útil?

Solução

Sim, encontrei a solução nas perguntas frequentes da dbunit na verdade

Posso usar o DBunit com colunas de identidade ou incremento automático?

Muitos RDBMSs permitem que as colunas de identidade e incremento automático sejam implicitamente substituídas com os valores do cliente. O DBunit pode ser usado com esses RDBMs nativamente. Alguns bancos de dados, como o MS SQL Server e o Sybase, precisam ativar explicitamente os valores do cliente. A maneira de ativar esse recurso é específica do fornecedor. O DBunit fornece essa funcionalidade para o MS SQL Server com a classe InsertIdentityOperation.

Embora esteja escrito para o MS SQL Server, também funciona para o Sybase. Então, eu pressiono meu conjunto de dados para DB com

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

Et voilà.

Obrigado pela sua resposta Rawheiser.

Outras dicas

Não é familiar o suficiente com o dbunit para ajudá -lo com os detalhes; Mas usei um truncado de tabela e recaída no valor de identidade em situações semelhantes.

dbcc checkident 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top