Включение IDENTITY_INSERT для таблицы, чтобы загрузить ее с модулем БД - PullRequest
5 голосов
/ 17 ноября 2010

Я пытаюсь загрузить таблицу, в которой есть столбец идентификаторов, с модулем БД.Я хочу иметь возможность установить значение идентификатора самостоятельно (я не хочу, чтобы база данных генерировала его для меня).

Вот минимальное определение моей таблицы

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

Чтобы вставить строку в X, я выполняю следующий SQL

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

Нет проблем.Но когда я пытаюсь загрузить эту таблицу со следующим набором XML-данных следующего блока дБ (RS_7_10_minimal_ini.xml)

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

с использованием следующего минимального теста 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() {
        // ...
}
}

Itпроисходит сбой со следующим исключением

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

Кажется, модуль БД не включает идентификацию перед включением строки, для которой указано значение столбца идентификации.

Я уже пытался выполнить себяна соединении, полученном из JdbcDataBaseTester, но не повезло.Возможно, новое соединение или не то же соединение, которое использовалось для передачи данных в базу данных.

Есть идеи?

Большое спасибо за вашу помощь всем!

Октава

Ответы [ 2 ]

9 голосов
/ 18 ноября 2010

Да, решение найдено в FAQ по DBUnit.

Можно ли использовать DbUnit со столбцами IDENTITY или с автоинкрементом?

Многие РСУБД позволяют столбцам IDENTITY и автоинкрементубыть неявно перезаписаны значениями клиента.DbUnit может использоваться с этими RDBMS изначально.Некоторые базы данных, такие как MS SQL Server и Sybase, должны явно активировать запись значений клиента.Способ активации этой функции зависит от поставщика.DbUnit предоставляет эту функциональность для MS SQL Server с помощью класса InsertIdentityOperation.

Хотя он написан для MS SQL Server, он также работает для Sybase.Поэтому я перевожу свой набор данных в db с помощью

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

Et voilà.

Спасибо за ваш ответ rawheiser.

1 голос
/ 17 ноября 2010

Не достаточно знаком с DBUnit, чтобы помочь вам со спецификой; но в подобных ситуациях я использовал усечение таблицы и повторное заполнение значения идентификатора.

dbcc checkident 
...