将带有变量列的DataTable写入数据库表

时间:2015-01-20 14:31:22

标签: c# sql-server datatable oledb

如果我使用SqlConnection,这可能会容易得多。但现在我有OleDbConnection,我想将整个DataTable复制到数据库表中。 DataTable每次都可以包含不同的列。所以我希望只插入匹配的列。

如果不一直遍历DataTable列并根据它构建INSERT查询,我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:4)

佩德拉姆,你一定可以。继续使用GetOleDbSchemaTable()获取详细信息。

这是你继续进行的方式,

DataSet output = new DataSet();
using (OleDbConnection conn = new OleDbConnection(strConn))
{
    conn.Open();

    DataTable schemaTable = conn.GetOleDbSchemaTable(
        OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

    // e.g. Rows in SchemaTable are Sheets in Xlsx file.
    foreach (DataRow schemaRow in schemaTable.Rows)
    {
        //... 
        string sheet = schemaRow["TABLE_NAME"].ToString();
        var select = "SELECT * FROM [" + sheet + "]";
        OleDbCommand cmd = new OleDbCommand(select, conn);
        cmd.CommandType = CommandType.Text;
        DataTable outputTable = new DataTable(sheet);
        output.Tables.Add(outputTable);
        new OleDbDataAdapter(cmd).Fill(outputTable);
    }
}

稍后,当您获得DataSet后,您可以使用DataTablemyDataSet.Tables用于DataTableCollection,但它们只有Foreach类型,仅支持IEnumerable() 1}}而不是var foo = dataSet.Tables.Cast<DataTable>().Where( t => t.TableName == "The Table I want"); 然后您可以在其上进行LINQ查询而无需迭代。 .NET开发人员还没有决定实现这一点,原因有很多,你可以通过here广泛阅读。

然而,有一个非常简单的解决方法,那就是 Casting 它。因此,如果您不想迭代集合并选择您想要的条目,请在 方法语法 中使用以下语法:

var bar = from DataTable t in dataSet.Tables
            where t.TableName == "The table I want" 
            select t;

查询语法LINQ 形式为,

OleDbConnection

希望我能理解你。因为我好奇,我花了很多时间自己搞清楚这一点。

<强>更新

批量复制

如果您要将整个表格复制到SqlBulkCopy以实现SqlConnection IRowsetFastLoad之类的内容,那么您将使用IRowsetFastLoad。你没有提到你是使用Ado.Net还是纯粹的OleDb。如果它是第一个选项并且您正在使用C#,那么SqlBulkCopy并未在此平台中实现,并且仅在C ++上实现。在这种情况下,你正在寻找迭代和磨牙。

另一方面,如果adapter.Update()是一个选项,我很确定你已经全身心投入了。如果没有,请快速查看以下文章。它清除了很多东西。

Using SqlBulkCopy to efficiently copy table from Access to SQL Server

我有一个快速的谷歌搜索,并遇到了诸如使用{{1}}之类的解决方案,但是之前我没有以这种方式使用它,如果不进行测试就无法对其进行评论。

DbDataAdapter.Update Method (DataTable)

可能值得一看。对不起,虽然有一半的答案。我必须完成你的评论才能完全理解你想要完成的任务。