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