none
Datagridview讀取excel後如何設定OLEDbCommand物件 RRS feed

  • 問題

  • 小弟在幾位前輩指導下學會匯入Excel在Datagridview中顯示

    參考了文章:  https://support.microsoft.com/zh-tw/kb/316934#bookmark-12

    之後想要更新資料和新增資料,經過前輩的開導知道要使用OLEDbCommand物件來達到

    今天研究了許久,對不起實在摸不透啊啊啊~苦惱!!

    我加入了OLEDbCommand物件,他的CommandText屬性應該是要先設定作用的資料來源才能執行命令文字

    可是我看了我學習的程式碼實在看不出哪個是資料來源=..=

    而且文章中有提到DataSet我也有試著加入,但是在加入資料集的時候卻顯示專案中沒有資料集

    附上程式碼:

    namespace Test06
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //開啟Excel檔案
                string ExcelPath = System.Windows.Forms.Application.StartupPath + @"\testexcel.xls";
                string OpenExcelData = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelPath + ";Extended Properties ='Excel 8.0;HDR=Yes;IMEX=2;ReadOnly=0'";
                string OutputSheet = "Select * From [Sheet1$]";//表格名稱=要填入Excel上Sheet的名稱

                OleDbConnection ExcelConnection = new OleDbConnection(OpenExcelData);

                try
                {
                    ExcelConnection.Open();//打開檔案連結

                    //讀取output
                    OleDbCommand ExCommendOut = new OleDbCommand(OutputSheet, ExcelConnection);
                    OleDbDataAdapter dataAdapterOut = new OleDbDataAdapter(ExCommendOut);
                    DataTable dTableOut = new DataTable();
                    dataAdapterOut.Fill(dTableOut);
                    dataGridView1.DataSource = dTableOut;

                    //自動調整DataGridView欄寬
                    dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
                    dTableOut.Dispose();
                    dataAdapterOut.Dispose();

                    //關閉檔案連結,釋放記憶體,若不關閉則系統會占用資源,匯入成功時一定要關閉
                    ExCommendOut.Dispose();
                    ExcelConnection.Close();
                    ExcelConnection.Dispose();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("檔案讀取失敗!\n" + ex.Message, "資料處理錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    if (ExcelConnection != null)
                        ExcelConnection.Close();
                }
            }

            private void button2_Click(object sender, EventArgs e)
            {

            }
        }
    }

    我的button2的click事件是要執行儲存的

    其中程式碼:dataAdapterOut.Fill(dTableOut);

    我查了一下應該是讀取,Fill可換成Update變成儲存

    可是如果我直接把dataAdapterOut.Fill(dTableOut);加入button2的click事件,會顯示

    1. dataAdapterOut不存在於目前內容中

    2. dTableOut不存在於目前內容中

    為甚麼之前不會,換到button2之後就錯誤了,求解呀前輩~~

    2016年5月2日 上午 11:56

解答

  • 因為dataAdapterOut和dTableOut這個變數定義在Form1_Load程序中, 所以button2_Click程序無法使用, 若要使用, 必須把這個變數定義在Form1類別中
    2016年5月5日 上午 06:52

所有回覆

  • 變數是要宣告的好嗎...老大。

    學程式要把來龍去脈學到,而不是只學到單點。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年5月2日 下午 02:59
    版主
  • 因為dataAdapterOut和dTableOut這個變數定義在Form1_Load程序中, 所以button2_Click程序無法使用, 若要使用, 必須把這個變數定義在Form1類別中
    2016年5月5日 上午 06:52