none
將EXCEL檔案讀入 DATASET 的作法 RRS feed

  • 問題

  • 我的作法是 寫一支ASPX,將EXCEL檔案上傳至SERVER,並利用下列連線字串  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=???;Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"""  將資料讀入 至DATASET 中處理!

    程式可以正常RUN,但沒過多久,當要開啟連線,就會丟出未指定的錯誤,重新開機就又好了..粉奇怪,我有上GOOLE查,有人提出跟我類似的問題,但一直沒看到解法,不曉得各位網友有無類似的經驗..請賜教..謝謝啦..

    我程式的寫法如下..

        Public Function IsXLSFormat(ByRef sErrMsg As String) As Boolean

            Dim cn As OleDbConnection = New OleDbConnection(_AConnStr)
            Dim bYes As Boolean = True
            Try
                cn.Open()
            Catch ex As Exception
                bYes = False
                sErrMsg = ex.Message
            End Try
            cn.Close()
            cn.Dispose()
            cn = Nothing

            Return bYes
        End Function

     

    2006年2月21日 上午 10:33

解答

  • 您好:

    請您改成『DataAdapter』的寫法:

    程式碼如下:

    Dim DS As System.Data.DataSet
    Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    Dim MyConnection As System.Data.OleDb.OleDbConnection

    MyConnection = New System.Data.OleDb.OleDbConnection( _
          "provider=Microsoft.Jet.OLEDB.4.0; " & _
          "data source=C:\myData.XLS; " & _
          "Extended Properties=Excel 8.0;")
    ' Select the data from Sheet1 of the workbook.
    MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
          "select * from [Sheet1$]", MyConnection)

    DS = New System.Data.DataSet()
    MyCommand.Fill(DS)
    MyConnection.Close()

    參考網址:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vbCode/html/vbtskCodeExampleReadingExcelDataIntoDataset.asp

     當然您可以加入 Try...Catch...Finally...End Try,在Finally內關閉所用到的資源試試。

    2006年2月22日 上午 01:29
  • 您好:

    看您貼出的範例,是先判斷是否為 Excel 的資料,
    在判斷傳回的 bool 。我這邊有處理約20MB的Excel也都正常運作。
    可能您要在您判斷 是否為 Excel 的資料 加入 finally 來關閉相關連線
    還有就是您讀取 資料方法可以使用 OleDbDataAdapter  來把資料進去。
    OleDbDataAdapter   會在使用完後自動關閉連線。
    您試試看這樣能否改善您的問題

     

       public void InitConnString()
            {
                //連線子句
                ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                    + soruceFile + ";Extended Properties=Excel 8.0";
                OleDbConn = new OleDbConnection(ConnStr);

            }

     public DataSet GetDataTable(string sheetFile)
            {
                //跑指定資料表資料表
                string query = "SELECT * FROM [" + sheetFile + "]";
                oleCommand = new OleDbCommand(query, OleDbConn);
                OleDbDataAdapter oleAdapter = new OleDbDataAdapter(oleCommand);
                DataSet dsDataTable = new DataSet();
                // 把Excel 的[Sheet1]填入ds
                oleAdapter.Fill(dsDataTable, sheetFile);

                return dsDataTable;
            }

    2006年2月22日 上午 02:30

所有回覆

  • 請問程式可以正常RUN
    是指說妳第一次打開可以,第二次就不行嗎?
    2006年2月21日 上午 11:21
  • 仔細看了您的提供的程式
    會不會是您在 catch 抓到了 Exception
    但並沒有結束連線
    要在您的程式中加入

     Dim cn As OleDbConnection = New OleDbConnection(_AConnStr)
            Dim bYes As Boolean = True
            Try
                cn.Open()
            Catch ex As Exception
                bYes = False
                sErrMsg = ex.Message

    Finally

         cn.Close()
            cn.Dispose()
            cn = Nothing
            End Try

    End Function

    您看這樣是否能夠解決您目前的問題!
     
     
       

    2006年2月21日 上午 11:38
  • 感謝回覆..

    不過...感覺好像沒差多少..但我還是會試試..

     ps : 程式都可以正常執行..原本以為是excel檔案太大..導致 無法開啟連線,但後來重開之後,重新上傳該excel檔,讀入dataset作處理,就又可以..我先前查詢的文章如下:

    http://www.issociate.de/board/post/281640/Microsoft_JET_Database_Engine_error_'80004005'.html

     

    2006年2月22日 上午 01:26
  • 您好:

    請您改成『DataAdapter』的寫法:

    程式碼如下:

    Dim DS As System.Data.DataSet
    Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
    Dim MyConnection As System.Data.OleDb.OleDbConnection

    MyConnection = New System.Data.OleDb.OleDbConnection( _
          "provider=Microsoft.Jet.OLEDB.4.0; " & _
          "data source=C:\myData.XLS; " & _
          "Extended Properties=Excel 8.0;")
    ' Select the data from Sheet1 of the workbook.
    MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
          "select * from [Sheet1$]", MyConnection)

    DS = New System.Data.DataSet()
    MyCommand.Fill(DS)
    MyConnection.Close()

    參考網址:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vbCode/html/vbtskCodeExampleReadingExcelDataIntoDataset.asp

     當然您可以加入 Try...Catch...Finally...End Try,在Finally內關閉所用到的資源試試。

    2006年2月22日 上午 01:29
  • 您好:

    看您貼出的範例,是先判斷是否為 Excel 的資料,
    在判斷傳回的 bool 。我這邊有處理約20MB的Excel也都正常運作。
    可能您要在您判斷 是否為 Excel 的資料 加入 finally 來關閉相關連線
    還有就是您讀取 資料方法可以使用 OleDbDataAdapter  來把資料進去。
    OleDbDataAdapter   會在使用完後自動關閉連線。
    您試試看這樣能否改善您的問題

     

       public void InitConnString()
            {
                //連線子句
                ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                    + soruceFile + ";Extended Properties=Excel 8.0";
                OleDbConn = new OleDbConnection(ConnStr);

            }

     public DataSet GetDataTable(string sheetFile)
            {
                //跑指定資料表資料表
                string query = "SELECT * FROM [" + sheetFile + "]";
                oleCommand = new OleDbCommand(query, OleDbConn);
                OleDbDataAdapter oleAdapter = new OleDbDataAdapter(oleCommand);
                DataSet dsDataTable = new DataSet();
                // 把Excel 的[Sheet1]填入ds
                oleAdapter.Fill(dsDataTable, sheetFile);

                return dsDataTable;
            }

    2006年2月22日 上午 02:30
  • 程式在RUN的時候EXCEL檔案有人在使用嗎?

    我碰到的通常都是EXCEL檔案有人在使用,所以出現錯誤

    可以試著關閉EXCEL檔案或是設成唯讀試試

    2006年3月20日 上午 06:24
  • 我的excel也讀不進去

    using System.Data.OleDb;

    DataSet mydataset=new DataSet();
      private void Form1_Load(object sender, System.EventArgs e)
      {
       int n;
       string str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=id.xls;Extended Properties=Excel 8.0";
       OleDbConnection conn=new OleDbConnection(str);
       conn.Open();
       //OleDbCommand cmd=conn.CreateCommand();
       //cmd.CommandText="select * from user";
       //n=cmd.ExecuteNonQuery();
       OleDbDataAdapter myadapter=new OleDbDataAdapter("select * from user",conn);
       myadapter.Fill(mydataset,"user");
      }

    兩種方法都進不去,不知那裡有錯

    2006年5月21日 上午 07:22
  • 1. 沒看到路徑:

    Data Source=id.xls;

    2. Excel 表格名要加 $

    "select * from [user$]"

    3. Excel 應該只能獨佔式開啟,亦即同時只能有一個使用者。

    2006年5月21日 上午 10:41
  • 請問一下

    的的程式再讀Excel的時候

    我有包try...catch

    會出現"定義太多欄位" 這個error message

    要是我換一個資料比較單純的excel就可以讀

    請問這是什麼問題

    2006年7月13日 上午 07:53
  • 這個問題我解決了

    是因為Excel 欄位太多的問題

    但是我又遇到一個瓶頸

    就是我一列有15個欄位

    可是我再讀取Data的時候

    就是固定有些欄位的值讀不到

    可是Excel上確定有值

     

    有誰知道是什麼原因嗎

     

    2006年7月14日 上午 12:26
  • 有可能你某一欄位中的資料開始時是一些數字

    所以這個欄位被當成是數值型態的欄位處理

    但接下來的資料中可能有些資料包含了字串

    因無法轉換為數值資料,所以便顯示為空白

    若真是這樣

    可以試試在連線字串的Extended Properties屬性中設定IMEX=1看能不能解決

     

    2006年10月4日 上午 09:36
  •  

    會發生

    10006282讀出來變1.00063e+006

    1011309讀出來變1.01131e+006

    這要怎麼解決呢 有人遇過嗎?

    2006年11月17日 上午 08:20
  • 請問一下,若excel檔案中的文字上有超連結,要如何讀取???
    2007年4月11日 上午 07:19