Как записать объект ODBC DataSet в таблицу базы данных с помощью C #? - PullRequest
0 голосов
/ 05 февраля 2011

Я занимаюсь модульным / автоматическим тестированием большого приложения, которое использует MSFT Sql Server, Oracle, а также Sybase в качестве бэк-энда.Возможно, есть лучшие способы взаимодействия с БД, но мне нужно использовать библиотеку ODBC.Учитывая эти ограничения, есть кое-что, что мне нужно выяснить, и я буду рад вашей помощи в этом.Мои тесты действительно меняют состояние базы данных, и я ищу недорогой, 99,99% надежный способ восстановить вещи после того, как я закончу (я чувствую, что полное восстановление БД после каждого теста - слишком много штрафа).Итак, я ищу дополнение к этой функции ниже - мне нужен способ заполнить таблицу из DataSet.

    private DataSet ReadFromTable(ODBCConnection connection, string tableName)
    {
        string selectQueryString = String.Format("select * from {0};", tableName);
        DataSet dataSet = new DataSet();
        using (OdbcCommand command = new OdbcCommand(selectQueryString, connection))
        using (OdbcDataAdapter odbcAdapter = new OdbcDataAdapter(command))
        {
            odbcAdapter.Fill(dataSet);
        }

        return dataSet;
    }

    // The method that I seek.
    private void WriteToTable(ODBCConnection connection, string tableName, DataSet data)
    {
        ...
    }

Я понимаю, что все может быть сложнее - что есть триггеры, что некоторые таблицы зависятна других.Однако мы практически не используем какие-либо ограничения для эффективности тестируемого приложения.Я даю вам эту информацию, так что, возможно, у вас есть предложение о том, как сделать вещи лучше / по-другому.Я открыт для разных подходов, если они хорошо работают.

Не подлежат обсуждению: MsTest библиотека, VS2010, C#, библиотека ODBC, поддержка всех 3 поставщиков.

1 Ответ

1 голос
/ 08 февраля 2011

Это то, что вы имеете в виду? Я мог бы что-то пропустить

В ReadFromTable

dataset.WriteXmlSchema(memorySchemaStream);
dataset.WriteXml(memoryDataStream);

В WriteToTable

/*  empty the table first */

Dataset template = new DataSet();
template.ReadXmlSchema(memorySchemaStream);
template.ReadXml(memoryDataStream);

Dataset actual = new DataSet();
actual.ReadXmlSchema(memorySchemaStream);

actual.Merge(template, false);

actual.Update();

Другой вариант: читать текущие данные, сравнивать с шаблоном и, основываясь на том, что вам не хватает, добавить данные в фактический набор данных. Единственное, что нужно помнить, это то, что вы не можете скопировать фактические DataRows из одного набора данных в другой, вы должны заново создать DataRows

...