2009-02-14 2 views
4

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

ответ

-2

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

+0

LINQ (то есть LINQ-to-SQL или Entity Framework) не очень поможет в наборе данных ... –

+0

Ударьте меня на него Marc – johnc

1

Возможно, вы захотите посмотреть DataAdapters и TypedDatasets.

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

7

В зависимости от того, сколько строк у вас есть в 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. Затем обновите таблицы в DataSet в порядке зависимости (т. Е. Сначала сделайте таблицы без зависимостей, затем зависимые таблицы).

Вот пример родительской/дочерней вставки (обратите внимание, что вы будете делать похожие вещи для обновлений). Таблица 1 является родительской и имеет ParentId (столбец идентичности) и поле NVARCHAR ParentValue. Таблица 2 является дочерней, имеет свой собственный столбец идентификаторов (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

Если DataTables и SQL таблицы выстраиваются в очередь, а затем быстрый способ SqlBulkCopy.