Pedram,当然可以。继续使用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 时,您可以使用 myDataSet.Tables 将您的 DataTables 从中取出,但是它们采用 DataTableCollection 类型,仅支持 Foreach 而不是 IEnumerable() 然后您可以在不需要迭代的情况下对其进行 LINQ 查询。由于多种原因,.NET 开发人员尚未决定实现此功能,您可以通过 here 广泛阅读。
但是有一个非常简单的解决方法,那就是铸造它。因此,如果您不想遍历集合并挑选您想要的条目,请继续并在 Method Syntax 中使用以下语法:
var foo = dataSet.Tables.Cast<DataTable>().Where(
t => t.TableName == "The Table I want");
或以 查询语法 LINQ 形式为,
var bar = from DataTable t in dataSet.Tables
where t.TableName == "The table I want"
select t;
希望我理解你的正确。因为我很好奇,所以我花了很多时间自己弄清楚这一点。
更新
批量复制
如果您想将整个表复制到 OleDbConnection 以实现类似于 SqlBulkCopy 在 SqlConnection 中所做的事情,您将希望使用 IRowsetFastLoad。您没有提到您使用的是 Ado.Net 还是纯 OleDb。如果它是第一个选项并且您正在使用 C#,不幸的是 IRowsetFastLoad 未在此平台上实现,仅在 C++ 上实现。在这种情况下,您正在考虑迭代和磨牙。
另一方面,如果SqlBulkCopy 是一个选项,我很确定你已经完成了。如果没有,请快速查看以下文章。它清除了很多东西。
Using SqlBulkCopy to efficiently copy table from Access to SQL Server
我在 Google 上进行了快速搜索,发现了使用 adapter.Update() 等解决方案,但我以前没有使用过这种方法,并且未经测试无法对其发表评论。
DbDataAdapter.Update Method (DataTable)
可能值得一看。抱歉,虽然回答了一半。我必须通过您的 cmets 才能完全了解您想要完成的任务。