如果我使用SqlConnection
,这可能会容易得多。但现在我有OleDbConnection
,我想将整个DataTable
复制到数据库表中。 DataTable
每次都可以包含不同的列。所以我希望只插入匹配的列。
如果不一直遍历DataTable
列并根据它构建INSERT查询,我怎样才能实现这一目标?
答案 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
后,您可以使用DataTable
将myDataSet.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)
可能值得一看。对不起,虽然有一半的答案。我必须完成你的评论才能完全理解你想要完成的任务。