2011-04-08 201 views
0

該程序是假定計算數據庫中的翻新並在文本框中返回一個值。我初始化我的值爲0,但我的問題是我怎麼得到它來計算每次用戶掃描一個單位被重新打磨。我試圖做的任何事情都會在我的程序中給我一個錯誤。現在它的返回值爲1,因爲我添加了RefurbRate ++。誰能幫我?如何獲得一個值在文本框中返回?

以下是我和我的代碼完成:

收起

private int GetRefurbRate() 
{ 
    string sql = ""; 
    int Refurb_Rate = 0; 
    int totalRefurb = 0; 
    int totalUnits = 0; 
    string error_msg = ""; 

    sql = "SELECT COUNT(*) " + 
      "FROM " + schema + ".repair_part rp " + 
      "WHERE rp.repair_ord = '" + txtRO.Text + "' "; 
    while (true) 
    { 
      if (!myDb.RunSql(sql, true)) 
      { 
      error_msg = "DBError for getting Refurb Rate"; 
      break; 
      } 
      if (myDb.dbRdr.HasRows) 
      { 
       if (myDb.dbRdr.Read()) 
       { 
       try 
       { 
        Refurb_Rate = (totalRefurb/totalUnits * 100); 
       } 
       catch (Exception e) 
       { 
         Console.WriteLine(e); 
       } 
       } 

       Refurb_Rate++; 
      } 
      break; 
    } 
    myDb.dbRdr.Close(); 
    if (error_msg != String.Empty) 
    { 
     MessageBox.Show(error_msg, "Get Refurb Rate", 
          MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
    } 
    return Refurb_Rate; 
} 
+0

Ummmmm你可以問以另一種方式的問題,因爲它不作出任何意義,我。 – 2011-04-08 21:58:49

+0

您的代碼中沒有文本框,我們如何提供幫助? – 2011-04-08 22:03:53

+1

他**是什麼「翻新」? 「掃描單元重新掃描」意味着什麼? – 2011-04-08 22:04:08

回答

0

有你需要解決,才能解決這個poroblem幾個問題。

首先和最重要的是是你的應用程序容易受到SQL注入。這會讓不好的人對你的數據庫做壞事。請閱讀parameterized queries以防止出現這種情況。

其次,我不知道myDb.RunSql(sql, true)是做什麼的,但似乎沒有使用標準方法從數據庫使用C#查詢數據。通常要使用以下方法:如果您使用這些會更容易讓我們來告訴你你在做什麼錯

  • 的SQLConnection
  • 的SqlCommand
  • SqlDataReader的

。如果你推出自己的東西會更困難。

如果您查看MSDN的SQLDataReader代碼示例,它將向您展示如何使用這三個類連接到數據庫,執行命令並處理結果。與totalUnits

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

2

這個錯誤來自除以零錯誤:請點這裏。它始終爲零。當錯誤被拋出時,它被catch塊所吃掉,它不會向調用者報告錯誤。這使得該方法來完成,並且將始終返回1

+0

我明白了,但我該如何讓公式具有除0之外的值?我不知道該怎麼做。 – Justin 2011-04-08 22:36:06

+0

@Justin你不能使用你正在使用的類型。 JIM編譯器的建議似乎是合理的,並解釋了這個問題。您可以使Refurb_Rate成爲double並在返回之前將其轉換爲int。或者我想你可以將你的賦值改爲Refurb_Rate:'Refurb_Rate = totalRefurb * 100/totalUnits;'注意在除以totalUnits之前將totalRefurb乘以100可以避免Snowbear JIM編譯器描述的問題。 – 2011-04-08 22:59:26

0

胡亂猜測,你有結果總是等於零,因爲你將int號位置:

totalRefurb/totalUnits * 100 

所以如果totalRefurb小於totalUnits和大於零,那麼結果將始終爲零,因爲它們以「整數」方式分割。你應該投其中一人雙:

double refurb_Rate = ((double)totalRefurb/totalUnits * 100); 

當然,我們還應該提到的是,編寫代碼的方式,這使得許多其他錯誤,很有可能的。

+0

我不斷收到你無法將double轉換爲int錯誤的錯誤。我假設另一個程序員使變量成爲一個整數,並影響到我。有什麼辦法可以使得整數除0之外還有一個值? – Justin 2011-04-08 22:37:32

0
  1. 您正在使用字段(myDb)來保存自定義數據庫接口對象。這很糟糕,因爲它構成不好。使用相同對象的多種方法可能會相互干擾。由於必須考慮整個計劃,因此很難推斷它的使用方式。儘可能避免這種持久狀態。更好的方法是將有狀態對象傳遞給需要它的方法,而無需在字段中引用它。更好的辦法是完全放棄接口,並使用.NET框架提供的數據庫對象。

    1. 您正在動態創建SQL語句作爲字符串。這很糟糕,因爲它會讓你打開SQL注入攻擊(特別是當文本框的內容被粘貼到字符串中時!「; DELETE FROM repair_ord; - 」)。一個更好的方法是使用存儲過程,或者至少改變,以便在您的語句中使用命名參數。顯然,這是爲了改變模式(改變環境?)。在整個數據庫之間切換會更安全。

    2. 你有一個恆定的真正控制的表達,這也是沒有用處的,因爲控制的每一個流程內循環導致break語句在while循環數據庫讀取的代碼。如果這是爲了在第一個if語句結束時創建一個隱含的goto,那麼有更好的方法來做到這一點(就像其他的一樣)。 while語句和break語句應該被刪除。

    3. 您似乎沒有使用從任何地方的select語句返回的值。

    4. 變量totalRefurb和totalUnits不會被置爲零以外任何東西。因此,該部門將始終拋出一個DivisionByZeroException。因此,Refurb_Rate從零修改的唯一時間是在末尾增加。所以它總是以1的值結束。

    5. try/catch是完全不必要的。顯然,它放置在那裏來處理DivisionByZeroException,但最好在分割之前通過檢查totalUnits = 0來避免異常。

    6. catch語句不應該捕獲一般的Exception對象。相反,如果無法避免,並且您知道如何處理它,則應該捕獲並處理您期望的特定異常。

    7. 文體上,它最好限制在其中變量用於儘可能小程序文本的量。因此,最好在初始化它的同一行上聲明sql變量。也沒有理由將它初始化兩次,就像你在開始時將它設置爲等於空字符串一樣。

這裏是你的程序的另一個版本:

private static int GetRefurbRate(string repairOrd, int totalUnits, string connection, string schema) 
{ 
    if (string.IsNullOrEmpty(repairOrd)) 
     return 0; 
    if (totalUnits == 0) 
     return 0; 
    if (string.IsNullOrEmpty(connection)) 
     throw new ArgumentException("Missing database connection for getting the refurb rate."); 
    if (string.IsNullOrEmpty(schema)) 
     throw new ArgumentException("Missing schema for getting the refurb rate."); 

    string sql = string.Format(@" 
      SELECT COUNT(*) AS TotalRefurb 
      FROM {0}.repair_part rp 
      WHERE rp.repair_ord = @repair_ord 
     ", schema); 

    int totalRefurb; 
    using (SqlConnection conn = new SqlConnection(connection)) 
    { 
     conn.Open(); 
     using (SqlCommand comm = new SqlCommand(sql, conn)) 
     { 
      comm.CommandType = CommandType.Text; 
      comm.Parameters.AddWithValue("@repair_ord", repairOrd); 
      using (SqlDataReader reader = comm.ExecuteReader()) 
      { 
       reader.Read(); 
       totalRefurb = (int)reader["TotalRefurb"]; 
      } 
     } 
    } 
    return totalRefurb/totalUnits * 100; 
} 
相關問題