【问题标题】:Write Dataset to SQL Table将数据集写入 SQL 表
【发布时间】:2010-10-07 15:28:48
【问题描述】:

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

【问题讨论】:

    标签: c# xml dataset


    【解决方案1】:

    根据您在 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 中的表(即,先处理没有依赖关系的表,然后是依赖表)。

    这是一个父/子插入的示例(请注意,您会为更新做类似的事情)。 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
    

    【讨论】:

    • 我正在寻找可以执行操作要求的操作,但是我的 SQL 具有标识列 - 我的 XML 当然是相关的 - 我必须重新验证数据是如何填充到 XML 中的,特别是Id 列,因为我不想用这些值更新 sql db - 我希望 sqldb 自动生成它们。关于如何做到这一点的任何想法?我的问题:stackoverflow.com/questions/52044849/…
    【解决方案2】:

    如果 DataTables 和 SQL Tables 排成一行,那么快速的方法是SqlBulkCopy

    【讨论】:

      【解决方案3】:

      您可能想查看 DataAdapters 和 TypedDatasets。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • LINQ(意为 LINQ-to-SQL 或实体框架)对数据集没有太大帮助...
        猜你喜欢
        • 2016-01-12
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        相关资源
        最近更新 更多