2016-01-28 25 views
0

我在執行循環內過程時遇到問題。我的要求是將數據插入表中。第一列是我試圖進入循環的字母表,接下來的三列對於所有行都是常見的。但是在第一次迭代之後,我發現錯誤必須是唯一的。錯誤在循環中執行過程

string str = Properties.Settings.Default.con; 
SqlConnection con = new SqlConnection(str); 

char[] az = Enumerable.Range('A', 'Z' - 'A' + 1).Select(i => (Char)i).ToArray(); 


SqlCommand cmd = new SqlCommand("Execute InsertPurchase @ShipTo,@StoreName,@desc,@Alpha", con); 
try 
{ 
    cmd.Parameters.AddWithValue("@ShipTo", txtstoreto.Text); 
    cmd.Parameters.AddWithValue("@StoreName", txtstorefrom.Text); 
    cmd.Parameters.AddWithValue("@desc", Globals.s_desc.ToString()); 
    con.Open(); 
    foreach (var c in az) 
    { 
     cmd.Parameters.AddWithValue("@Alpha", c.ToString()); 
     cmd.ExecuteNonQuery(); 
    } 
    con.Close(); 
    j = true; 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

錯誤消息:

變量名 '@Alpha' 已聲明。變量名稱在查詢批處理或存儲過程中必須是唯一的。

+2

那是因爲你的'foreach'的。 Foreach在z中添加新參數。在將其添加爲參數之前,先構建您的C字符串。 –

回答

3

您一次又一次地在循環中添加參數Alpha

因此,而不是在循環中加入它,你只需要設置其值爲:

cmd.Parameters.Add("@Alpha", SqlDbType.VarChar); 
con.Open(); 
foreach (var c in az) 
{ 
    cmd.Parameters["@Alpha"].Value = c.ToString(); 
    cmd.ExecuteNonQuery(); 
} 

還要注意使用的AddWithValue是不是在大多數情況下是個好主意,因爲它試圖從推斷參數類型值通過。在大多數情況下,最好明確設置參數類型。

+0

爲了您的答案*完整*一,請在上面添加一行'@ Alpha'參數創建 –

+0

@DmitryBychenko哦,謝謝。最初錯過了。 –

+0

我現在得到這個錯誤! 這個SqlParameterCollection不包含帶ParameterName'@Alpha'的SqlParameter。 --------------------------- OK ------------------- -------- – Jobin

0

我想你會一直添加@Alpha參數... 第一次添加參數並設置值。 每次後續迭代,只需設置值。

如第一次迭代....

cmd.Parameters.AddWithValue("@Alpha", c.ToString()); 

後續的迭代....

cmd.Parameters["@Alpha"].Value = c.ToString(); 

好運。

0

作爲一種替代方法,您可以在您的for循環中移動所有參數聲明,並在每次迭代中移動它們。

foreach (var c in az) 
{ 
    cmd.Parameters.Clear(); 
    cmd.Parameters.AddWithValue("@ShipTo", txtstoreto.Text); 
    cmd.Parameters.AddWithValue("@StoreName", txtstorefrom.Text); 
    cmd.Parameters.AddWithValue("@desc", Globals.s_desc.ToString()); 
    cmd.Parameters.AddWithValue("@Alpha", c.ToString()); 
    cmd.ExecuteNonQuery(); 
} 

當然不過,這會增加不必要的第一 3每次迭代參數,並再次清除它們。

順便說一下,儘可能不要使用AddWithValueIt may generate unexpected and surprising results sometimes。使用Add方法重載指定您的參數類型及其大小。

還可以使用using statement來自動處置您的連接和命令,而不是手動調用CloseDispose方法。

0

你必須清除變量再次添加事情是這樣的:

foreach (var c in az) 
    { 
     cmd.Parameters.Clear(); 
     cmd.Parameters.AddWithValue("@ShipTo", txtstoreto.Text); 
     cmd.Parameters.AddWithValue("@StoreName", txtstorefrom.Text); 
     cmd.Parameters.AddWithValue("@desc", Globals.s_desc.ToString()); 
     cmd.Parameters.AddWithValue("@Alpha", c.ToString()); 
     cmd.ExecuteNonQuery(); 
    }