Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据集写入SQL表_C#_Xml_Dataset - Fatal编程技术网

C# 将数据集写入SQL表

C# 将数据集写入SQL表,c#,xml,dataset,C#,Xml,Dataset,我已经将一个复杂的XML文件转换为一个数据集,该数据集包含7个表和大约70列。我已经在SQL Server中创建了这些表,以使用XML模式匹配数据集中的表。如何轻松地将数据集写入SQL表?如果使用.NET 3/3.5,可以查看LINQ。您可能需要查看数据适配器和类型数据集 这些都可以通过VS designer获得,只需创建一个数据集,然后从服务器资源管理器视图中放入SQL表即可。:)(或者类似的,已经有一段时间了)根据数据集中的行数,最好使用SqlCommandBuilder,如下所示: var

我已经将一个复杂的XML文件转换为一个数据集,该数据集包含7个表和大约70列。我已经在SQL Server中创建了这些表,以使用XML模式匹配数据集中的表。如何轻松地将数据集写入SQL表?

如果使用.NET 3/3.5,可以查看LINQ。

您可能需要查看数据适配器和类型数据集


这些都可以通过VS designer获得,只需创建一个数据集,然后从服务器资源管理器视图中放入SQL表即可。:)(或者类似的,已经有一段时间了)

根据数据集中的行数,最好使用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");
如果在数据集中的表之间定义了复杂的关系,恐怕不能使用SqlCommandBuilder。相反,您需要做的是为数据集中的每个表定义一个数据适配器。然后,按照依赖关系顺序更新数据集中的表(即,首先更新没有依赖关系的表,然后更新依赖表)

下面是一个父/子插入的示例(请注意,对于更新,您也会执行类似的操作)。表1是父项,具有ParentId(标识列)和NVARCHAR字段ParentValue。表2是子表,它有自己的标识列(ChildId)、外键字段(ParentId)和自己的值(ChildValue)


如果数据表和SQL表排列在一起,那么一个快速的方法是。

LINQ(意思是LINQ到SQL或实体框架)对数据集没有多大帮助…我正在寻找一些东西来完成op要求的工作,但是,我的SQL有标识列—我的XML当然是相关的—我必须重新验证数据是如何填充到XML中的,特别是Id列,因为我不想用这些值更新SQL db—我希望SQL db自动生成它们。你知道怎么做吗?我的问题:
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