2016-01-28 80 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(); 
    }