2010-03-05 75 views
0
public static void fillCheckList(string ListType,int RecordNum,CheckBox chkRequired,TextBox txtComplete,TextBox txtMemo) 
    { 
     string sql_Check = String.Format(@"SELECT l.Required,l.Completed,l.ISP,l.Memo_Notes, 
              t.List_Desc 
              FROM List_Data l, List_Type t 
              WHERE l.List_ID = t.List_ID 
              AND l.Record_Num = {0} 
              AND t.List_Desc = '{1}'", RecordNum,ListType); 
     ListData LIST = new ListData(); 
     SqlConnection sqlConn = null; 
     SqlCommand cmd_Check; 
     SqlDataReader dr_Check; 
     try 
     { 
      sqlConn = new SqlConnection(databaseConnectionString); 
      sqlConn.Open(); 
      cmd_Check = new SqlCommand(sql_Check, sqlConn); 
      dr_Check = cmd_Check.ExecuteReader(); 

      while (dr_Check.Read()) 
      { 
       LIST = new ListData(Convert.ToBoolean(dr_Check["Required"]), dr_Check["Completed"].IsNull() ? (DateTime?)null : Convert.ToDateTime(dr_Check["Completed"]), dr_Check["Memo_Notes"].ToString()); 
      } 
      chkRequired.Checked = LIST.REQUIRED; 
      txtComplete.Text = LIST.COMPLETED.HasValue ? LIST.COMPLETED.Value.ToShortDateString() : ""; 
      txtMemo.Text = LIST.MEMO_NOTES; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Error found in fillCheckList..." + Environment.NewLine + e.ToString()); 
     } 
     finally 
     { 
      if (sqlConn != null) 
      { 
       sqlConn.Close(); 
      } 
     } 
    } 

正如你所看到的,我爲項目id,列表類型的字符串變量和2文本框類型取一個整數變量。 我因此使用這種方法來接受4個參數..我想要做的是我也希望它接受5個參數。那就是..再包含一個文本框.. ,這樣它可以接受4個參數或相應的5個參數/ 我該怎麼做同樣的方法。單一方法接受3個參數或4個參數

+2

使用SqlDataParameters !!! – Andrey 2010-03-05 14:32:04

+7

您有一個SQL注入漏洞。 **你需要使用參數** – SLaks 2010-03-05 14:34:34

+0

答案中也有參數,但這些人正在談論一種不同類型的參數(你可能不知道)。 將您的sql字符串更改爲使用@RecordNum和@ListType,而不是使用{0}和{1}。接下來,在SqlCommand對象中,像這樣插入參數:cmd.Parameters.Add(「@RecordNum」,System.Data.SqlDbType.Int).Value = RecordNum; – apandit 2010-03-05 14:49:11

回答

2

params是你的朋友。

如:

public static void fillCheckList(string ListType,int RecordNum,CheckBox chkRequired, params TextBox[] txtBoxes) 
{ 
    TextBox txtComplete = null; 
    TextBox txtMemo = null; 
    TextBox txtThirdOne = null; 

    if(txtBoxes.Length < 1) 
    { 
     throw new Exception("At least the txtComplete-Textbox has to be given"); 
    } 
    else 
    { 
     txtComplete = txtBoxes[0]; 

     if(txtBoxes.Length >= 2) 
      txtMemo = txtBoxes[1]; 

     if(txtBoxes.Length >= 3) 
      txtThirdOne = txtBoxes[2]; 
    } 

    // do stuff  
} 
+0

params是你最糟糕的噩夢...(在這種情況下) – Diadistis 2010-03-05 18:02:35

3

如果您使用的是C#4.0中,您可以使用Optional Arguments。如果不是,則應使用方法重載並使用一個重載以最後一個參數的默認值調用另一個重載。

0

您有3個選擇

1.

public static void fillCheckList(string ListType, int RecordNum, CheckBox chkRequired, TextBox txtComplete, TextBox txtMemo) { 
    fillCheckList(ListType, RecordNum, chkRequired, txtComplete, txtMemo, null); 
} 
public static void fillCheckList(string ListType, int RecordNum, CheckBox chkRequired, TextBox txtComplete,TextBox txtMemo,TextBox txtMemo, TextBox txtMemo) { 
    // implementation 
} 
  • 公共靜態無效fillCheckList(串ListType,整數RecordNum,複選框chkRequired,IEnumerable的文本框){ //執行 }

  • 3.

    public static void fillCheckList(string ListType, int RecordNum, CheckBox chkRequired, params TextBox[] textBoxes) { 
         // implementation 
        } 
    

    選項1是好的,如果你需要添加不同的成員,你有一個有限的可能性。

    選項2.沒問題。但不是優雅的3.

    選項3.也許是最好的事情,只要添加的參數有一個共同的祖先對象,如果它必須是。請記住,參數一直是最後一個參數。

    1

    您可以使用PARAMS,但它要求要麼你有相同類型的參數的隨機數或具有參數的鬆散類型集合(對象)

    您也可以用5個參數寫你的功能,並提供一個帶4個參數的重載方法,它調用前者並默認最後一個參數。

    public static void fillCheckList(string ListType, int RecordNum, CheckBox chkRequired, TextBox txtComplete) 
         { 
          fillCheckList(ListType, RecordNum, chkRequired, txtComplete, null); 
         } 
    
    10

    請勿爲此使用params。

    使用PARAMS代表的想法:「我可以採取零個,一個或任意多額外的參數,這聽起來像你想採取零個或一個額外的參數

    TJMonk15是對的;你應該或者使用可選參數(在C#4中),或者編寫兩個方法,並讓其中一個調用另一個參數,並使用默認值作爲額外參數。

    (爲了上帝的緣故,修復了SQL注入漏洞!)

    相關問題