首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用GetSchema获取第一个表

使用GetSchema获取第一个表
EN

Stack Overflow用户
提问于 2020-05-02 07:17:46
回答 1查看 752关注 0票数 0

我正在尝试获取Excel文件的第一张表格:

代码语言:javascript
运行
复制
try
{
    string constring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filepath + ";Extended Properties=Excel 12.0;";
    OleDbConnection conn = new OleDbConnection(constring);
    conn.Open();
    DataTable myTables = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    var myTableName = conn.GetSchema("Tables").Rows[0].Table;
    string sqlquery = string.Format("SELECT * FROM [{0}]", myTableName);
    OleDbDataAdapter da = new OleDbDataAdapter(sqlquery, conn);
    da.Fill(dt); 
    MessageBox.Show(Convert.ToString(dt.Rows.Count));
    return dt;
}
catch (Exception e)
{
    MessageBox.Show(e.Message, "Error", MessageBoxButton.OK, 
    MessageBoxImage.Error);
    return dt;
}

我做错了什么?

编辑:

出现以下错误:数据库引擎找不到“Tables”对象。

这适用于Visual:

代码语言:javascript
运行
复制
Try
    Dim constring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" &
                                        "Data Source=" & filepath &
                                        ";Extended Properties=Excel 12.0;"
    Dim conn As New OleDbConnection(constring)
    conn.Open()
    Dim myTables As DataTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
    Dim myTableName = conn.GetSchema("Tables").Rows(0)("TABLE_NAME")
    Dim sqlquery As String = String.Format("SELECT * FROM [{0}]", myTableName)
    Dim da As New OleDbDataAdapter(sqlquery, conn)
    da.Fill(dt)
    conn.Close()
    MsgBox(dt.Rows.Count)
    Return dt
Catch ex As Exception
    MsgBox(Err.Description, MsgBoxStyle.Critical)
    Return dt
End Try

我正在尝试用C#复制它。

这条错误线似乎是这样的:

代码语言:javascript
运行
复制
var myTableName = conn.GetSchema("Tables").Rows[0].Table;

它试图在VB代码中复制以下一行:

代码语言:javascript
运行
复制
Dim myTableName = conn.GetSchema("Tables").Rows(0)("TABLE_NAME")
EN

回答 1

Stack Overflow用户

发布于 2020-05-03 08:24:07

在这里,这一切都是放在一起的。文件路径字符串前面的@符号接受字符串,不使用\作为转义。在内插字符串中,我们确实需要嵌入双引号的转义字符。“使用”块确保关闭和处理连接。我在一个组合框中显示了结果。

代码语言:javascript
运行
复制
 private void opCode()
    {
        string filePath = @"C:\Users\xxx\Documents\Excel\TestImport.xlsx";
        string conString = $"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {filePath} ; Extended Properties = \"Excel 12.0; HDR = YES;\"";
        Debug.Print(conString);
        DataTable dt;
        using (OleDbConnection cn = new OleDbConnection(conString))
        {
            cn.Open();
            dt = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        }
        var exSheets = (from dRow in dt.AsEnumerable()
                        select dRow["TABLE_Name"]).ToArray();
        cbo1.Items.AddRange(exSheets);
    }

*注: Linq查询不一定按工作簿中的顺序返回工作表

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61555756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档