none
程序出现 too many fields defined的错误 代码是否缺失了什么 RRS feed

  • 问题

  • 程序出现 oledbexception was unhandled (too many fields defined) 的错误

    请指点谢谢感恩

        Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click

            Dim Chosen_File As String = ""

            If openFileDialog1.ShowDialog() = DialogResult.OK Then
                Chosen_File = openFileDialog1.FileName
            End If

            If Chosen_File = String.Empty Then
                Return
            End If

            InputExcel.Text = Chosen_File

            Dim ds = New DataSet()
            Dim path = InputExcel.Text
            Dim con As String = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1;';"

            If InputExcel.Text = ".xlsx" Then
                MessageBox.Show("Wrong File Type", "Error Message")
                Return
            End If

            Using connection As OleDbConnection = New OleDbConnection(con)
                connection.Open()
                Dim sheets As DataTable = GetSchemaTable(con)
                For Each r As DataRow In sheets.Rows
                    Dim data As DataTable = New DataTable()
                    ComboBox1.Items.Add(r("TABLE_NAME").ToString())
                    Dim query As String = "SELECT * FROM [" & r("TABLE_NAME").ToString() & "]"
                    Dim adapter = New OleDbDataAdapter(query, connection)
                    adapter.Fill(data)
                    ds.Tables.Add(data) 'Table1
                Next
            End Using
        End Sub
        Private Function GetSchemaTable(ByVal connectionString As String) As DataTable
            Using connection As OleDbConnection = New OleDbConnection(connectionString)
                connection.Open()
                Dim schemaTable As DataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
                Return schemaTable
            End Using
        End Function



    2020年3月5日 4:53

答案

  • Hi christing,

    对于你出现的异常,似乎你忘记添加 * 通配符。

    SELECT * FROM ...

    >>我想让我的combo box 都得到我的excel file 有多少个excel sheet。

    你可以参考以下代码将Excel中的所有表显示在ComboBox中:

            Dim xlApp As Microsoft.Office.Interop.Excel.Application = New Microsoft.Office.Interop.Excel.Application()
            Dim excelBook As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Open("D:\Test.xlsx")
            Dim excelSheets As String() = New String(excelBook.Worksheets.Count - 1) {}
            Dim i As Integer = 0
    
            For Each wSheet As Microsoft.Office.Interop.Excel.Worksheet In excelBook.Worksheets
                excelSheets(i) = wSheet.Name
                i += 1
            Next
    
            ComboBox1.Items.AddRange(excelSheets)

    然后再根据ComboBox中选择的表名操作相应的表即可。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 christing 2020年3月15日 7:09
    2020年3月13日 8:26
    版主

全部回复

  • 第一個可能性 : 你的 excel 檔案定義的 columns 超過了  255,所以 select command 最好不要用 select * 而是明確的寫 select [column1], [column2] .... from.....

    第二個可能性,excel 在剩餘的空白處有某些輸入空白字元的地方,以至於被認為是有效的 columns (因此會超過 255 columns),先檢查 excel 檔案,將不必要的部分一次刪除。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2020年3月5日 12:15
  • @Bill Chung

    感谢你的回复。我检查了我的excel file 我的 excel file 有1 千个column。

    如果excel file 过1000 column 能通 select [column1], [column2] 的方式呈现数据吗

    谢谢

    2020年3月6日 0:56
  • 如果真的需要一次讀進這麼多的 Columns,在 select command 中使用 range 替代 sheet 試試看。

    可以參考 Import data from Excel File into a dataTable: column limit?  討論中的回答


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年3月6日 3:50
  • Hi christing,

    正如 Bill Chung 所建议的,你可以指定查询的范围,从而减少查询的数量。

    例如:

    SELECT [column1], [column2] FROM [Source_sheet$A1:BF]

    Too many fields defined” when querying Excel using ADO

    或者你可能需要压缩数据库,具体可见文档:在 Access 中保存表时出现 "定义过多的字段" 错误

    另外,你也可以尝试规范你的数据库。

    数据库标准化基础说明

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年3月6日 9:49
    版主
  • @Xingyu Zhao

    感谢你的回复。

    此代码能读到我read excel file 后,user可以通过SHEETNAME 查看他要的sheet

    Dim query As String = "SELECT * FROM [" & r("TABLE_NAME").ToString() & "]"

    当我的sheet data 出现too many field  时,我需要指定我excel file 所读的sheet的范围

    以下是我该篇的代码。我出现

         ComboBox1.Items.Add(r("TABLE_NAME").ToString())
              Dim query As String = "SELECT FROM [" & r("TABLE_NAME").ToString() & "[$A1:BF]"

    我想让我的combo box 都得到我的excel file 有多少个excel sheet。

    user 可以选择自己要读的excel sheet。

    感谢你的回复。谢谢

    2020年3月12日 9:28
  • Hi christing,

    对于你出现的异常,似乎你忘记添加 * 通配符。

    SELECT * FROM ...

    >>我想让我的combo box 都得到我的excel file 有多少个excel sheet。

    你可以参考以下代码将Excel中的所有表显示在ComboBox中:

            Dim xlApp As Microsoft.Office.Interop.Excel.Application = New Microsoft.Office.Interop.Excel.Application()
            Dim excelBook As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Open("D:\Test.xlsx")
            Dim excelSheets As String() = New String(excelBook.Worksheets.Count - 1) {}
            Dim i As Integer = 0
    
            For Each wSheet As Microsoft.Office.Interop.Excel.Worksheet In excelBook.Worksheets
                excelSheets(i) = wSheet.Name
                i += 1
            Next
    
            ComboBox1.Items.AddRange(excelSheets)

    然后再根据ComboBox中选择的表名操作相应的表即可。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 christing 2020年3月15日 7:09
    2020年3月13日 8:26
    版主
  • @xing yu zhao 

    您提供的代码我所理解是当user click 时根据excel file name read 出excel file 有多少个sheet。

     Dim path As String
            path = "D:\HTC.xls"
            Dim connetionString As String = Nothing
            Dim connection As OleDbConnection
            Dim command As OleDbCommand
            Dim adapter As New OleDbDataAdapter()
            Dim ds As New DataSet()
            Dim i As Integer = 0
            Dim sql As String = Nothing
            connetionString = "provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1;';"
            sql = ComboBox2.SelectedText
            connection = New OleDbConnection(connetionString)
            Try
                connection.Open()
                command = New OleDbCommand(sql, connection)
                adapter.SelectCommand = command
                adapter.Fill(ds)
                adapter.Dispose()
                command.Dispose()
                connection.Close()
                ComboBox2.DataSource = ds.Tables(0)
            Catch ex As Exception
                MessageBox.Show("Can not open connection ! ")
            End Try
            DataGridView1.DataSource = ds.Tables(ComboBox2.SelectedIndex)
        End Sub


    当user select combo box 选择sheet。

    遇到的问题是select的sheet 没有show在 DataGridView1 



    2020年3月16日 7:05
  • Hi christing,

    由于原始问题已经得到答复,为了帮助其他人更快和更明确的找到对于特定问题的答案, 我建议你创建一个新问题,我们会在新问题下给你提供帮助。

    感谢你的积极参与。

    Best Regards,

    Xingyu Zhao


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2020年3月16日 9:20
    版主
  • @ Xingyu Zhao

    好的。感谢你的回复

    2020年3月16日 9:51