C# While循环中的SQL插入

C# While循环中的SQL插入,c#,C#,我尝试使用while循环来循环一些数据,然后将每个数据添加到sql中。这是我到目前为止所做的代码: SqlCommand cmd = new SqlCommand(); cmd.Connection = SqlConn; while (dr.Read()) { cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser,

我尝试使用while循环来循环一些数据,然后将每个数据添加到sql中。这是我到目前为止所做的代码:

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = SqlConn;
        while (dr.Read())
            {
                cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)";
                cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0;
                cmd.Parameters.Add("@Coupon", SqlDbType.NVarChar).Value = dr[0].ToString();
                cmd.Parameters.Add("@CreatedByUser", SqlDbType.NVarChar).Value = "3517";
                cmd.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = "0";
                cmd.Parameters.Add("@ExpiresOn", SqlDbType.NVarChar).Value = "01/01/2013";
                cmd.Parameters.Add("@Quantity", SqlDbType.NVarChar).Value = "100";
                cmd.Parameters.Add("@Title", SqlDbType.NVarChar).Value = "Mr.";
                cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = dr[3].ToString();
                cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = dr[4].ToString();
                cmd.Parameters.Add("@Company", SqlDbType.NVarChar).Value = dr[2].ToString();
                cmd.Parameters.Add("@Address1", SqlDbType.NVarChar).Value = dr[5].ToString();
                cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = dr[6].ToString();
                cmd.Parameters.Add("@Region", SqlDbType.NVarChar).Value = dr[7].ToString();
                cmd.Parameters.Add("@Zip", SqlDbType.NVarChar).Value = dr[8].ToString();
                cmd.Parameters.Add("@Country", SqlDbType.NVarChar).Value = dr[9].ToString();
                cmd.Parameters.Add("@WorkPhone", SqlDbType.NVarChar).Value = dr[10].ToString();
                cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = dr[11].ToString();
                cmd.Parameters.Add("@Campaign", SqlDbType.NVarChar).Value = txtCampaign.Text;
                cmd.Parameters.Add("@Source", SqlDbType.NVarChar).Value = dr[12].ToString();
                cmd.Parameters.Add("@Market", SqlDbType.NVarChar).Value = txtMarketSegment.Text;
                cmd.Parameters.Add("@Notes", SqlDbType.NVarChar).Value = txtNotesToSales.Text;
                cmd.CommandType = CommandType.Text;
                SqlConn.Open();
                cmd.ExecuteNonQuery();
                SqlConn.Close();

            }
但是,第二次通过它时,会到达
cmd.ExecuteNonQuery()并给出此错误:
已声明变量名“@PortalID”。在查询批处理或存储过程中,变量名必须是唯一的。

知道我做错了什么吗


谢谢

cmd
的作用域超出了
的范围,而
循环,因此您设置的所有内容(即参数)都会在迭代之间保持不变

将其更改为此,以便其工作:

while (dr.Read())
{
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = SqlConn;
    // ... rest as before
}

您最好先填充一个
数据集,然后循环使用它,或者将其结果累加一次发送到存储过程。对于任何大型结果集,这将是非常低效的。

在循环中实例化一个新的SQLCommand可能会解决您的问题。像这样:

    while (dr.Read())
    {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = SqlConn;
            cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)";
            cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0;
            cmd.Parameters.Add("@Coupon", SqlDbType.NVarChar).Value = dr[0].ToString();
            cmd.Parameters.Add("@CreatedByUser", SqlDbType.NVarChar).Value = "3517";
            cmd.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = "0";
            cmd.Parameters.Add("@ExpiresOn", SqlDbType.NVarChar).Value = "01/01/2013";
            cmd.Parameters.Add("@Quantity", SqlDbType.NVarChar).Value = "100";
            cmd.Parameters.Add("@Title", SqlDbType.NVarChar).Value = "Mr.";
            cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = dr[3].ToString();
            cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = dr[4].ToString();
            cmd.Parameters.Add("@Company", SqlDbType.NVarChar).Value = dr[2].ToString();
            cmd.Parameters.Add("@Address1", SqlDbType.NVarChar).Value = dr[5].ToString();
            cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = dr[6].ToString();
            cmd.Parameters.Add("@Region", SqlDbType.NVarChar).Value = dr[7].ToString();
            cmd.Parameters.Add("@Zip", SqlDbType.NVarChar).Value = dr[8].ToString();
            cmd.Parameters.Add("@Country", SqlDbType.NVarChar).Value = dr[9].ToString();
            cmd.Parameters.Add("@WorkPhone", SqlDbType.NVarChar).Value = dr[10].ToString();
            cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = dr[11].ToString();
            cmd.Parameters.Add("@Campaign", SqlDbType.NVarChar).Value = txtCampaign.Text;
            cmd.Parameters.Add("@Source", SqlDbType.NVarChar).Value = dr[12].ToString();
            cmd.Parameters.Add("@Market", SqlDbType.NVarChar).Value = txtMarketSegment.Text;
            cmd.Parameters.Add("@Notes", SqlDbType.NVarChar).Value = txtNotesToSales.Text;
            cmd.CommandType = CommandType.Text;
            SqlConn.Open();
            cmd.ExecuteNonQuery();
            SqlConn.Close();

        }

但是,你确定要这样做吗。为什么不一次插入所有数据-例如,请参阅Yucks answers。

您应该在循环外部使用默认值创建这些参数,并在每次迭代期间访问这些参数并设置其新参数

小结:不要在每次迭代中添加它们,而是访问它们

编辑:

为了更具体,请检查此MSDN条目:

  • SqlParameterCollection索引器

在重用command对象时,您将在第二次迭代中添加另一组参数

在循环外部添加参数,并设置在循环内部更改的值


此外,您应该在循环之前打开数据库连接,然后关闭它。

您不需要每次都打开和关闭连接

SqlCommand cmd = new SqlCommand();
cmd.Connection = SqlConn;
cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)";
cmd.CommandType = CommandType.Text;
SqlConn.Open();

while (dr.Read())
{
    cmd.Parameters.Clear()

    cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0;

    ''' other parameters here

    cmd.ExecuteNonQuery();
}

SqlConn.Close();
您不需要每次都创建一个新的SqlCommand

SqlCommand cmd = new SqlCommand();
cmd.Connection = SqlConn;
cmd.CommandText = "insert into CPC_Coupons(PortalID, CreatedByUser, CouponCode, ProductID, ExpiresOn, Quantity, Title, FirstName, LastName, Company, Address1, City, Region, Zip, Country, WorkPhone, Email, Campaign, Source, Market, Notes) values(@PortalID, @CreatedByUser, @Coupon, @ProductID, @ExpiresOn, @Quantity, @Title, @FirstName, @LastName, @Company, @Address1, @City, @Region, @Zip, @Country, @WorkPhone, @Email, @Campaign, @Source, @Market, @Notes)";
cmd.CommandType = CommandType.Text;
SqlConn.Open();

while (dr.Read())
{
    cmd.Parameters.Clear()

    cmd.Parameters.Add("@PortalID", SqlDbType.NVarChar).Value = 0;

    ''' other parameters here

    cmd.ExecuteNonQuery();
}

SqlConn.Close();

对不起,我的错误-可能没有给你足够的时间编辑你的答案。请重新编辑它,这样我就可以重新投票了。你是否投票其实并不重要。共享连接是可以的。