none
關於程式執行問題 RRS feed

  • 問題

  • 是這樣子的,小妹有點問題想要請教各位大大
    目前我的程式在第一次執行的時候,顯示出來的結果均為正確
    但第二次執行顯示出來的結果卻顯示出不正確的結果@@
    明明輸入的號碼與比對的檔案都是一樣的,沒有任何改變...
    不過如果把程式關掉再重新執行的話,顯示出來的結果就又會正確了!
    但程式沒關閉繼續執行的話,顯示結果就會錯誤 ...QQ
    找了很多資料以及原因,結果還是一樣,只好來這裡求助各位大大 ><
    由於不知道這個問題應該提供哪個片段的程式碼
    所以就沒有貼上來了,如果後續有需要的話,會再提供上來~謝謝!!!!


    第一次執行的正確結果

    第二次執行的錯誤結果
    2017年4月24日 上午 06:44

解答

  • 你的code太亂了,又寫又delete file,看了我十幾分鐘才看個明白。

    我看到有可能出錯的地方了,你有一個 Global  variable,

    List<Part> pn = new List<Part>();

    這個在第一次執行時,會是空的,但在第一次執行後,再按Confirm button,它還是有值,這導致第一次按Confirm button和以後的每一次按也會不同。

    最簡單就是,在每次按Confirm button時重設這個pn

    public void RFPN(string filerote)
    {
       pn = new List<Part>();
       try
       {
          ...
          ...
       }
       ...
       ...
    }


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


    2017年4月27日 上午 06:58

所有回覆

  • 這肯定要說明邏輯與看程式碼才知道的吧

    2017年4月24日 下午 12:32
  • 看起來是出在 資料 Binding 到 DataGridView 那一段。 

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

    2017年4月24日 下午 02:53
    版主
  • 你好,請從 Confirm Button Click 的 code,直到 Datagridview.bind的 code,貼上來看看吧

    其中可以看到,dataset或datatable bind錯到另外一個 datagridgrid,而且其中一個抓錯data


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.

    2017年4月25日 上午 01:10
  • 你好,請從 Confirm Button Click 的 code,直到 Datagridview.bind的 code,貼上來看看吧

    其中可以看到,dataset或datatable bind錯到另外一個 datagridgrid,而且其中一個抓錯data

    .....恕刪

            string connString;
            string str;
            //宣告連線字串
            OdbcConnection conn = null;
            //Odbc
            public void OdbcCon(string str, string connString)
            {
                OdbcConnection conn = new OdbcConnection(connString);
                OdbcCommand com = new OdbcCommand(str, conn);
                try
                {
                    conn.Open();
                    com.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                finally
                {
                    conn.Close();
                }
            }
    
            //Confirm按鈕
            private void dgs_Click(object sender, EventArgs e)
            {
                if (textBox1.Text != "")
                {
                    mesbox();
                }
                else
                {
                    MessageBox.Show("欄位不得為空!", "Oops", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
    
            //List
            public class Part
            {
                public string ITEM_PN { get; set; }
                public string LOCATION { get; set; }
            }
    
            //訊息視窗
            public void mesbox()
            {
                //例外處理
                try
                {
                    DialogResult res = MessageBox.Show("WorkOder Is Correct ?", "Confirm Window", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (res == DialogResult.Yes)
                    {
                        MessageBox.Show("Plz Chose DGS File", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        using (OpenFileDialog ofd = new OpenFileDialog())
                        {
                            // 使用者選擇好檔案後按下確定鍵時執行
                            if (ofd.ShowDialog() == DialogResult.OK)
                            {
                                alldgs(ofd.FileName);
                            }
                        }
                    }
                    else if (res == DialogResult.No)
                    {
                        MessageBox.Show("請重新輸入工單號碼", "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }       
    
            int rc, pc; //宣告總行數變數
            //CRB擷取需要的資料出來
            public void alldgs(string filerote)
            {
                StreamReader dr = new StreamReader(filerote, System.Text.Encoding.Default);
                //將檔案全部讀入,並將資料給予dgsdata
                string dgsdata = dr.ReadToEnd();
                //string dgsdata = File.ReadAllText(filerote);
                //依據分割標準,將所有檔案分割成一行一行
                string[] alldata = dgsdata.Split("\n".ToCharArray());
                int a = 0, b = 0, c = 0, d = 0;
                for (int i = 0; i < alldata.Length; i++)
                {
                    //找尋檔案內是否有該字串
                    if (alldata[i].Contains("[PositionData<1>]"))
                    {
                        a = i + 1;
                    }
                    if (alldata[i].Contains("[PatternData<1>]"))
                    {
                        b = i - 1;
                    }
                    if (alldata[i].Contains("[PartsData]"))
                    {
                        c = i + 1;
                    }
                    if (alldata[i].Contains("[PartsGroup]"))
                    {
                        d = i - 1;
                    }
                }
                string rfname = "RF";
                string pnname = "PN";
                //建立新的檔案
                FileStream rf = new FileStream(Path.GetDirectoryName(filerote) + @"\" + rfname + ".csv", FileMode.Create);
                FileStream pn = new FileStream(Path.GetDirectoryName(filerote) + @"\" + pnname + ".csv", FileMode.Create);
                //開啟檔案,準備將資料寫進新建立的檔案裡
                StreamWriter rfw = new StreamWriter(rf, System.Text.Encoding.Unicode);
                StreamWriter pnw = new StreamWriter(pn, System.Text.Encoding.Unicode);
                //將指定的行數寫入此新建立的檔案裡
                int rcount = 0, pcount = 0;
                for (int j = a; j < b; j++)
                {
                    rfw.Write(alldata[j]);
                    rcount++;
                }
                for (int j = c; j < d; j++)
                {
                    pnw.Write(alldata[j]);
                    pcount++; 
                }
                rfw.Flush(); //關閉緩衝區
                rfw.Close(); //關閉串流
                rf.Close(); //關閉檔案
                pnw.Flush(); //關閉緩衝區
                pnw.Close(); //關閉串流
                pn.Close(); //關閉檔案
                dr.Close();
                rc = rcount;
                pc = pcount;
                RFPN(filerote);
                File.Delete(Path.GetDirectoryName(filerote) + "\\" + "RF.csv");
                File.Delete(Path.GetDirectoryName(filerote) + "\\" + "PN.csv");
            }
    
            private void wocheck_Click(object sender, EventArgs e)
            {
                Application.Restart();
            }
    
            //比對RF及PN資料
            string[,] rfd;
            List<Part> pn = new List<Part>();
            public void RFPN(string filerote)
            {
                try
                {
                    //RF
                    StreamReader rfdr = new StreamReader(Path.GetDirectoryName(filerote) + "\\" + "RF.csv", System.Text.Encoding.Default);
                    //將檔案全部讀入,並將資料給予data
                    string rfdata = rfdr.ReadToEnd();
                    rfdata = rfdata.Replace("\"", "");
                    //依據分割標準,將所有檔案分割成一行一行
                    string[] rfalldata = rfdata.Split(" ".ToCharArray());
                    rfd = new string[rc, 2];
                    for (int i = 0; i < rc; i++) {
                        if (a < rfalldata.Length && b < rfalldata.Length) {
                            rfd[i, 0] = rfalldata[a];
                            rfd[i, 1] = rfalldata[b];
                            a = a + 49;
                            b = b + 49;
                        } 
                    }
    
                    //PN
                    StreamReader pndr = new StreamReader(Path.GetDirectoryName(filerote) + "\\" + "PN.csv", System.Text.Encoding.Default);
                    //將檔案全部讀入,並將資料給予data
                    string pndata = pndr.ReadToEnd();
                    pndata = pndata.Replace("\r", " ");
                    pndata = pndata.Replace("\"", "");
                    //依據分割標準,將所有檔案分割成一行一行
                    string[] pnalldata = pndata.Split(" ".ToCharArray());
                    string[,] pnd = new string[pc, 2];
                    for (int i = 0; i < pc; i++)
                    {
                        if (c < pnalldata.Length && d < pnalldata.Length)
                        {
                            pnd[i, 0] = pnalldata[c];
                            pnd[i, 1] = pnalldata[d];
                            c = c + 50;
                            d = d + 50;
                        }
                    }
    
                    rfdr.Close();
                    pndr.Close();
    
                    //交叉比對資料
                    for (int i = 0; i < rc; i++) {
                        for (int j = 0; j < pc; j++) {
                            if (rfd[i, 0] == pnd[j, 0]) {
                                rfd[i, 0] = pnd[j, 1];
                                break;
                            }
                        }
                    }
    
                        //撈資料表查詢結果
                        connString = "DSN=Test;" + "UID=sa;" + "PWD=pass;";
                        str = @"SELECT ITEM_PO,LOCATION FROM V_WO_SMT WHERE WO = '" + textBox1.Text + "';";
                        conn = new OdbcConnection(connString);
                        conn.Open();
                        OdbcCommand cmd = new OdbcCommand(str, conn);
                        OdbcDataReader read = cmd.ExecuteReader();
                        while (read.Read())
                        {
                            pn.Add(new Part { ITEM_PN = read["ITEM_PO"].ToString() , LOCATION = read["LOCATION"].ToString() });
                        }
                        read.Close();
                        conn.Close();
    
                    if (pn.Count > 0) {
                        woerror();
                        dgerror();
                    }
                    else{
                        MessageBox.Show("查不到此工單號碼資料,請確認是否有輸入錯誤!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            //宣告在這,讓每個類別都可以使用
            int a = 54, b = 73, c = 50, d = 51;
    
            public void woerror() {
                List<Part> erwo = new List<Part>();
                int h = 0;
                for (int i = 0; i < rc / 2; i++)
                {
                    bool result = false;
                    while (!result)
                    {
                        if (h < pn.Count)
                        {
                            if (rfd[i, 0] == pn[h].ITEM_PN && rfd[i, 1] == pn[h].LOCATION)
                            {
                                h = 0;
                                result = true;
                            }
                            else
                            {
                                h++;
                            }
                        }
                        else
                        {
                            if ((rfd[i, 0] != "0" && rfd[i, 1] != "test") && (rfd[i, 0] != "" && rfd[i, 1] != "") && (rfd[i, 0] != null && rfd[i, 1] != null))
                            {
                                erwo.Add(new Part { ITEM_PN = rfd[i, 0], LOCATION = rfd[i, 1] });
                                h = 0;
                                result = true;
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
                dataGridView1.DataSource = erwo;
            }
    
            public void dgerror() {
                List<Part> erdg = new List<Part>();
                int h = 0;
                for (int i = 0; i < pn.Count; i++)
                {
                    bool result = false;
                    while (!result)
                    {
                        if (h < rc)
                        {
                            if (pn[i].ITEM_PN == rfd[h, 0] && pn[i].LOCATION == rfd[h, 1])
                            {
                                h = 0;
                                result = true;
                            }
                            else
                            {
                                h++;
                            }
                        }
                        else
                        {
                            erdg.Add(new Part { ITEM_PN = pn[i].ITEM_PN, LOCATION = pn[i].LOCATION });
                            h = 0;
                            result = true;
                        }
                    }
                }
                dataGridView2.DataSource = erdg;
            }
    已將所有程式碼放上來,再煩請各位高手了!謝謝~
    2017年4月25日 上午 09:29
  • 請先處理 SQL Injection 的問題比較好。

    //撈資料表查詢結果
    connString = "DSN=Test;" + "UID=sa;" + "PWD=pass;";
    str = @"SELECT ITEM_PO,LOCATION FROM V_WO_SMT WHERE WO = '" + textBox1.Text + "';"; // SQL Injection
    conn = new OdbcConnection(connString);
    


    強力監督SQL Injection問題!!

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

    2017年4月27日 上午 03:23
    版主
  • 你的code太亂了,又寫又delete file,看了我十幾分鐘才看個明白。

    我看到有可能出錯的地方了,你有一個 Global  variable,

    List<Part> pn = new List<Part>();

    這個在第一次執行時,會是空的,但在第一次執行後,再按Confirm button,它還是有值,這導致第一次按Confirm button和以後的每一次按也會不同。

    最簡單就是,在每次按Confirm button時重設這個pn

    public void RFPN(string filerote)
    {
       pn = new List<Part>();
       try
       {
          ...
          ...
       }
       ...
       ...
    }


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    請記得將對您有幫助的回覆 標示為解答 以幫助其他尋找解答及參與社群討論的朋友們。
    Please remember to click Mark as Answer on the post that helps you. This can be beneficial to other community members reading the thread.


    2017年4月27日 上午 06:58
  • 請先處理 SQL Injection 的問題比較好。

    //撈資料表查詢結果
    connString = "DSN=Test;" + "UID=sa;" + "PWD=pass;";
    str = @"SELECT ITEM_PO,LOCATION FROM V_WO_SMT WHERE WO = '" + textBox1.Text + "';"; // SQL Injection
    conn = new OdbcConnection(connString);

    ...恕刪
    謝謝小朱大大提醒資安問題,這部分小妹會再查詢相關資料更正!!!
    2017年4月28日 上午 02:38
  • 你的code太亂了,又寫又delete file,看了我十幾分鐘才看個明白。

    我看到有可能出錯的地方了,你有一個 Global  variable,

    List<Part> pn = new List<Part>();

    這個在第一次執行時,會是空的,但在第一次執行後,再按Confirm button,它還是有值,這導致第一次按Confirm button和以後的每一次按也會不同。

    最簡單就是,在每次按Confirm button時重設這個pn

    public void RFPN(string filerote)
    {
       pn = new List<Part>();
       try
       {
          ...
          ...
       }
       ...
       ...
    }
    ...恕刪
    試過這個方法,終於OK了!!!
    真的是太感謝KenLin大了~

    • 已編輯 Douadoua 2017年4月28日 上午 02:42
    2017年4月28日 上午 02:42