2012-12-20 55 views
2
string menuRecipe = "SELECT * FROM recipelist WHERE menu_ID = '" + menuID + "'"; 
MySqlCommand recipeCmd = new MySqlCommand(menuRecipe, db.mycon); 
MySqlDataReader recipeDr = recipeCmd.ExecuteReader(); 
string[] info = new string[8]; 
while (recipeDr.Read()) 
{ 
    info[1] = (recipeDr["recipe_ID"].ToString()); 
    info[2] = (recipeDr["stock_ID"].ToString()); 
    info[4] = (recipeDr["recipe_quantity"].ToString()); 
    string stockName = "SELECT stock_name FROM stocksdb WHERE stock_ID = '" + info[2] + "'"; 
    cmd = new MySqlCommand(stockName, db.mycon); 
    MySqlDataReader nameDr = cmd.ExecuteReader(); 
    while (nameDr.Read()) 
    { 
     info[3] = (nameDr["stock_name"].ToString()); 
    } 
    this.recipeList.Items.Add(new ListViewItem(new string[] { info[1], info[2], info[3], info[4] })); 
} 

我主要想減少使用多個SQL命令字符串,但我不知道如何,以及如何將它們隔離到各自的位置,因爲有些可能會混亂起來。任何想法如何縮短這段代碼?

+0

夥計們,我可以要求一個很好的鏈接? –

+1

這可以通過DataReader輕鬆完成。我很困惑你的代碼試圖完成什麼。 recipelist和stocksdb之間的關係如何?您是否期望配方列表查詢有多個結果?你是否期待stocksdb查詢有多個結果?如果沒有,爲什麼他們在一個聲明而不是if語句?另外,連接sql字符串是一個壞習慣 - 您應該使用參數化查詢。 –

+0

用於SQL的字符串連接是一個壞主意;這是SQL注入的祕訣。您應該使用參數化查詢。 – Servy

回答

5

你可以改變你的查詢

SELECT r.*, s.stock_name FROM recipelist r 
LEFT OUTER JOIN stocksdb s ON r.stock_ID = s.stock_ID 
WHERE menu_ID = @parameter 
+0

好吧,我會試試這個。但我可以問一下'r'。和's'。代表? –

+0

@JohnErnestGuadalupe他們是表recipelist和stocksdb的別名 –

+0

噢,好的謝謝 –

2

您可以在初始查詢中執行INNER JOIN,以將stocksdb錶鏈接到stock_ID上的配方列表表。

+2

請問這是怎麼回事? –

2

我會更改您的代碼是這樣的:

string connect = "..."; 
using (var cn = new SqlConnection(connect)) 
{ 
    cn.Open(); 

    string sql = @" 
SELECT r.*, s.stock_name 
FROM recipelist r 
LEFT OUTER JOIN stocksdb s ON r.stock_ID = s.stock_ID 
WHERE menu_ID = @MenuID"; 
    var cmd = new SqlCommand(sql, cn); 
    cmd.Parameters.Add("@MenuID", SqlDbType.Int).Value = menuID; 
    var dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     this.recipeList.Items.Add(new ListViewItem(new string[] { 
      dr["recipe_ID"].ToString(), 
      dr["stock_ID"].ToString(), 
      dr["stock_name"].ToString(), 
      dr["recipe_quantity"].ToString() 
     })); 
    } 
}