2011-02-05 5 views
0

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

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 library, VS2010, C#, ODBC Library, поддержка для всех 3 поставщиков.

ответ

1

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

с видом В 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

+0

Возможно, спасибо. Вполне возможно, что API ODBC имеет то, что мне нужно. Я просто не уверен на 100%, где приходит материал xml. Возможно, это будет способ упорствовать? Что произойдет с объектом набора данных, если я буду менять строки под ним? Возможно, я мог бы просто клонировать его? Возможно, вы сделали это для слияния. Это хорошо, но все, что мне нужно, - это сброс состояния db после теста или набора тестов. Тем не менее, я также хотел бы вычислить разницу между двумя таблицами (для тестовой логики сравнения). Надеюсь, это имеет смысл. Не стесняйтесь задавать вопросы. –

+0

XML-материал действительно сохраняется. Клонирование не будет работать, потому что вы хотите, чтобы записи были вставлены обратно в db. Если вы клонируете набор данных, все его строки будут отмечены как неизменные, поэтому при вызове «Обновление» ничего не изменится. Если вы хотите восстановить то, что изменилось, вы можете попытаться загрузить фактический набор данных из db, а затем вызвать Merge. Если вы закончите с неправильным результатом, вам нужно написать более тонкое слияние, сравнивая строки за строкой и добавляя то, что вам не хватает, удалите лишнее, обновите другое. Не отменяется, но не бесплатно ... – rene

+0

Спасибо, позволь мне поиграть с этим немного ... –