Консольное приложение C #.SQLBulkCopy и быстрый ввод XML в базу данных SQL Server - PullRequest
1 голос
/ 21 марта 2011

C # с .net 2.0 с бэкэндом БД SQL Server 2005.

У меня есть несколько XML-файлов, которые содержат данные в соответствии со следующим: структура немного отличается, но выглядит примерно так:

<TankAdvisory>
  <WarningType name="Tank Overflow">
    <ValidIn>All current tanks</ValidIn> 
    <Warning>Tank is close to capacity</Warning> 
    <IssueTime Issue-time="2011-02-11T10:00:00" /> 
    <ValidFrom ValidFrom-time="2011-01-11T13:00:00" /> 
    <ValidTo ValidTo-time="2011-01-11T14:00:00" /> 
  </WarningType>
</TankAdvisory>

У меня есть одна таблица БД, в которой есть все поля, готовые для заполнения.

Когда я использую следующий метод чтения данных из файла XML:

DataSet reportData = new DataSet();
reportData.ReadXml("../File.xml");

Он успешно заполняет набор данных, но с несколькими таблицами. Поэтому, когда я использую SQLBulkCopy, я могу сохранить только одну таблицу следующим образом:

sbc.WriteToServer(reportData.Tables[0]);

Или, если я перебираю все таблицы в наборе данных, добавляя их, он добавляет новую строку в базу данных, когда в действительности все они должны храниться в одной строке.

Тогда, конечно, существует и проблема сопоставления столбцов, я думаю, что, возможно, SQLBulkCopy - неправильный способ сделать это.

Что мне нужно сделать, так это найти быстрый способ передачи данных из этого XML-файла в базу данных под соответствующими столбцами в БД.

Ответы [ 4 ]

1 голос
/ 22 декабря 2011
foreach (DataColumn myCol in dtSecond.Columns)
{
    dataTable.Columns.Add(myCol.ColumnName);
    for (int intRowcnt = 0; intRowcnt <= dtSecond.Rows.Count - 1; intRowcnt++)
    {
        dataTable.Rows[intRowcnt][myCol.ColumnName] = dtSecond.Rows[intRowcnt][myCol];
    }
}
1 голос
/ 14 октября 2011

Хорошо, оригинальный вопрос немного устарел, но я только что нашел способ решить эту проблему.

Все, что вам нужно сделать, - это перебрать все DataTables, которые есть в вашем DataSet, и добавить их в One DataTable, который имеет все столбцы в таблице в вашей БД, вот так ...

DataTable dataTable = reportData.Tables[0];

//Second DataTable
DataTable dtSecond = reportData.Tables[1];

foreach (DataColumn myCol in dtSecond.Columns)
{

    sbc.ColumnMappings.Add(myCol.ColumnName, myCol.ColumnName);
    dataTable.Columns.Add(myCol.ColumnName);
    dataTable.Rows[0][myCol.ColumnName] = dtSecond.Rows[0][myCol];
}

//Finally Perform the BulkCopy

sbc.WriteToServer(dataTable);
0 голосов
/ 21 марта 2011

Зачем изобретать велосипед?Используйте SSIS .Считайте с XML Source , преобразуйте с одним из множества Преобразований , затем загрузите его с OLE Db Destination в таблицу SQL Server.Вы никогда не одолеете SSIS с точки зрения времени выполнения, скорости развертывания решения, обслуживания, обработки ошибок и т. Д. И т. Д.

0 голосов
/ 21 марта 2011

SqlBulkCopy для многих вкладышей. Это идеально подходит для тех случаев, когда в противном случае вы генерируете много операторов INSERT и манипулируете ограничением на общее количество параметров в пакете. Что касается класса SqlBulkCopy, это то, что он капризный. Если вы не укажете полностью все сопоставления столбцов для набора данных, возникнет исключение.

Я предполагаю, что ваши данные вполне управляемы, так как вы читаете их в DataSet. Если вам нужны еще большие наборы данных, вы можете поднять куски в память, а затем сбросить их в базу данных по частям. Но если все подходит сразу, это так просто.

SqlBulkCopy - самый быстрый способ поместить данные в базу данных. Просто установите сопоставления столбцов для всех столбцов, иначе это не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...