Записать набор данных в таблицу SQL - PullRequest
5 голосов
/ 14 февраля 2009

Я преобразовал сложный XML-файл в набор данных, содержащий 7 таблиц и около 70 столбцов. Я создал таблицы в SQL Server, чтобы они соответствовали таблицам в наборе данных с использованием схемы XML. Как я могу легко записать свой набор данных в таблицы SQL?

Ответы [ 4 ]

7 голосов
/ 14 февраля 2009

В зависимости от того, сколько строк в DataSet у вас есть, вероятно, лучше всего будет использовать SqlCommandBuilder, например:

var connection = new SqlConnection("my connection string");
connection.Open();

// repeat for each table in data set
var adapterForTable1 = new SqlDataAdapter("select * from table1", connection);
var builderForTable1 = new SqlCommandBuilder(adapterForTable1);
adapterForTable1.Update(myDataSet, "Table1");

Если у вас есть сложные отношения, определенные между таблицами в DataSet, боюсь, вы не можете использовать SqlCommandBuilder. Вместо этого вам нужно определить адаптер данных для каждой таблицы в вашем наборе данных. Затем обновите таблицы в DataSet в порядке зависимостей (т. Е. Сначала делайте таблицы без зависимостей, затем с зависимыми таблицами).

Вот пример вставки родитель / потомок (обратите внимание, что вы будете делать аналогичные вещи для обновлений). Table1 является родительским и имеет ParentId (столбец идентификации) и поле NVARCHAR ParentValue. Table2 является дочерним, имеет собственный столбец идентификаторов (ChildId), поле внешнего ключа (ParentId) и свое собственное значение (ChildValue).

var myDataSet = new DataSet();

// ** details of populating the dataset omitted **

// create a foreign key relationship between Table1 and Table2.
// add a constraint to Table2's ParentId column, indicating it must
// existing in Table1.
var fk = new ForeignKeyConstraint("fk", myDataSet.Tables["Table1"].Columns["ParentId"], myDataSet.Tables["Table2"].Columns["ParentId"])
{
    DeleteRule = Rule.Cascade,
    UpdateRule = Rule.Cascade
};
myDataSet.Tables["Table2"].Constraints.Add(fk);
myDataSet.EnforceConstraints = true;

var connection = new SqlConnection("my connection string");
var adapterForTable1 = new SqlDataAdapter();
adapterForTable1.InsertCommand =
    new SqlCommand("INSERT INTO MasterTable (ParentValue) VALUES (@ParentValue); SELECT SCOPE_IDENTITY() AS ParentId", connection);
adapterForTable1.InsertCommand.Parameters.Add("@ParentValue", SqlDbType.NVarChar).SourceColumn = "ParentValue";
var adapterForTable2 = new SqlDataAdapter();
adapterForTable2.InsertCommand =
    new SqlCommand("INSERT INTO ChildTable (ParentId, ChildValue) VALUES (@ParentId, @ChildValue); SELECT SCOPE_IDENTITY() AS ChildId", connection);
adapterForTable2.InsertCommand.Parameters.Add("@ParentId", SqlDbType.Int).SourceColumn = "ParentId";
adapterForTable2.InsertCommand.Parameters.Add("@ChildValue", SqlDbType.NVarChar).SourceColumn = "ChildValue";

connection.Open();
adapterForTable1.Update(myDataSet, "Table1"); // insert rows in parent first
adapterForTable2.Update(myDataSet, "Table2"); // child second
3 голосов
/ 15 февраля 2009

Если таблицы данных и таблицы SQL совпадают, то быстрый способ - SqlBulkCopy .

1 голос
/ 14 февраля 2009

Возможно, вы захотите взглянуть на DataAdapters и TypedDatasets.

Все они доступны через конструктор VS, просто создайте набор данных и удалите таблицы SQL из представления обозревателя серверов. :) (или что-то в этом роде)

0 голосов
/ 14 февраля 2009

Если вы используете .NET 3 / 3.5, вы можете заглянуть в LINQ.

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