C# System.Data.SqlClient.SqlException:';必须声明标量变量"@ID"';

C# System.Data.SqlClient.SqlException:';必须声明标量变量"@ID"';,c#,asp.net,C#,Asp.net,我一直收到错误信息 System.Data.SqlClient.SqlException:'必须声明标量变量“@ID”。- 我有一个gridview,它可以捕获用户输入到文本框中的内容,并通过单击按钮将其提交到数据库。当用户单击该按钮时,我还试图将当前登录的用户存储到数据库表中。有人能帮我解释一下为什么这条消息一直在发生吗 这是我的按钮点击事件的C代码 protected void btnSubmit_Click(object sender, EventArgs e) { string

我一直收到错误信息

System.Data.SqlClient.SqlException:'必须声明标量变量“@ID”。-

我有一个gridview,它可以捕获用户输入到文本框中的内容,并通过单击按钮将其提交到数据库。当用户单击该按钮时,我还试图将当前登录的用户存储到数据库表中。有人能帮我解释一下为什么这条消息一直在发生吗

这是我的按钮点击事件的C代码

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string query = "insert into Stock_Take_Item(ItemID, BarQuantity, StorageQuantity) values(@ID, @BAR, @STORAGE); insert into Stock_Take(Username, StockDate)" +
            " values(@Username, GetDate())";

    SqlConnection con = new SqlConnection(connectionString);

    SqlCommand cmd = new SqlCommand(query, con);
    con.Open();

    cmd.Parameters.AddWithValue("@Username", Session["username"].ToString());

    foreach (GridViewRow row in gvStockTake.Rows)
    {
        Label ID = row.FindControl("itemId") as Label;
        TextBox BAR = row.FindControl("txtBar") as TextBox;
        TextBox STORAGE = row.FindControl("txtStorage") as TextBox;

        cmd.Parameters.Clear();

        cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID.Text;
        cmd.Parameters.Add("@BAR", SqlDbType.Int).Value = BAR.Text;
        cmd.Parameters.Add("@STORAGE", SqlDbType.Int).Value = STORAGE.Text;

        cmd.ExecuteNonQuery(); //query execution
    }

    con.Close();
    Response.Write("Successfully inserted stock take items.");
}
这是我登录C代码的代码


我对ASP.NET和C#还不熟悉,所以非常感谢您的推荐

我会成批做一些事情——这会减少访问数据库的次数

protected void btnSubmit_Click(object sender, EventArgs e)
{

    var counter = 0;
    var query = @"insert into Stock_Take_Item
                  (ItemID, BarQuantity, StorageQuantity)
                  values
              ({1}, {2}, {3});
               insert into Stock_Take
               (Username, StockDate) 
               values
               ({0}, GetDate());";

    var paramList = new List<SqlParameter>();
    var sqlBulk = new StringBuilder(10000);
    var p0 = "@0";
    var maxRows = 100;
    var currRow = 0;
    var totalRows = 0;

    foreach (GridViewRow row in gvStockTake.Rows)
    {
        Label ID = row.FindControl("itemId") as Label;
        TextBox BAR = row.FindControl("txtBar") as TextBox;
        TextBox STORAGE = row.FindControl("txtStorage") as TextBox;

        currRow++;        
        totalRows++;

        if (counter == 0)
        {
            paramList.Add(new SqlParameter(, Session["username"].ToString()));            
        }
        var p1 = "@" + ++counter;
        var p2 = "@" + ++counter;
        var p3 = "@" + ++counter;

        paramList.AddRange(new[]{
            new SqlParameter(p1, Convert.ToInt32(Id.Text),
            new SqlParameter(p2, Convert.ToInt32(BAR.Text),
            new SqlParameter(p3, Convert.ToInt32(STORAGE.Text)
            });

        sqlBulk.AppendFormat(query, p0, p1, p2, p3);

        if (currRow == maxRows || totalRows == gvStockTake.Rows)
        {
            using (var con = new SqlConnection(connectionString))
            {
                using (var cmd = new SqlCommand(sqlBulk.ToString(), con))
                {
                    cmd.Parameters.AddRange(paramList);
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            currRow = 0;
            counter = 0;
            paramList.Clear();
            sqlBulk.Length = 0;
        }

    }

}
protectedvoid btnSubmit\u单击(对象发送方,事件参数e)
{
var计数器=0;
var query=@“插入库存项目”
(ItemID、BarQuantity、StorageQuantity)
价值观
({1}, {2}, {3});
插入存货清单
(用户名,股票日期)
价值观
({0},GetDate());”;
var paramList=新列表();
var sqlBulk=新的StringBuilder(10000);
var p0=“@0”;
var maxRows=100;
var currRow=0;
var totalRows=0;
foreach(gvStockTake.Rows中的GridViewRow行)
{
标签ID=行。FindControl(“itemId”)作为标签;
TextBox BAR=row.FindControl(“txtBar”)作为TextBox;
TextBox STORAGE=row.FindControl(“txtStorage”)作为TextBox;
currRow++;
totalRows++;
如果(计数器==0)
{
添加(新的SqlParameter(,会话[“username”].ToString());
}
变量p1=“@”++计数器;
var p2=“@”++计数器;
var p3=“@”++计数器;
paramList.AddRange(新[]{
新的SqlParameter(p1,Convert.ToInt32(Id.Text),
新的SqlParameter(p2,Convert.ToInt32(BAR.Text),
新的SqlParameter(p3,Convert.ToInt32(STORAGE.Text)
});
AppendFormat(查询,p0,p1,p2,p3);
如果(currRow==maxRows | | totalRows==gvStockTake.Rows)
{
使用(var con=newsqlconnection(connectionString))
{
使用(var cmd=new SqlCommand(sqlBulk.ToString(),con))
{
cmd.Parameters.AddRange(paramList);
con.Open();
cmd.ExecuteNonQuery();
}
}
currRow=0;
计数器=0;
paramList.Clear();
sqlBulk.Length=0;
}
}
}

免责声明:未测试。

而不是
cmd.Parameters.Clear();
为什么不重置该值?此外,您还可以执行
cmd.Parameters.AddWithValue(@Username),…
然后清除它您的查询包含两个不同的insert语句-我觉得这些语句应该单独执行?这可能是问题所在。@jocull不是真的。他可以这样做。事实上,可能只是将参数收集到一个大批量中,而不是单独执行单独的insert。这样,只需要一次到DB。这取决于bi的工作方式g是总负载
SqlCommand
SqlConnection
都是一次性的,因此都应该在
using
块中。连接的释放(当它退出using块时)处理关闭,因此您不需要。我建议您查看一下。清除参数集合将清除您的用户名(设置在循环之前)。你是这个意思吗?
protected void btnSubmit_Click(object sender, EventArgs e)
{

    var counter = 0;
    var query = @"insert into Stock_Take_Item
                  (ItemID, BarQuantity, StorageQuantity)
                  values
              ({1}, {2}, {3});
               insert into Stock_Take
               (Username, StockDate) 
               values
               ({0}, GetDate());";

    var paramList = new List<SqlParameter>();
    var sqlBulk = new StringBuilder(10000);
    var p0 = "@0";
    var maxRows = 100;
    var currRow = 0;
    var totalRows = 0;

    foreach (GridViewRow row in gvStockTake.Rows)
    {
        Label ID = row.FindControl("itemId") as Label;
        TextBox BAR = row.FindControl("txtBar") as TextBox;
        TextBox STORAGE = row.FindControl("txtStorage") as TextBox;

        currRow++;        
        totalRows++;

        if (counter == 0)
        {
            paramList.Add(new SqlParameter(, Session["username"].ToString()));            
        }
        var p1 = "@" + ++counter;
        var p2 = "@" + ++counter;
        var p3 = "@" + ++counter;

        paramList.AddRange(new[]{
            new SqlParameter(p1, Convert.ToInt32(Id.Text),
            new SqlParameter(p2, Convert.ToInt32(BAR.Text),
            new SqlParameter(p3, Convert.ToInt32(STORAGE.Text)
            });

        sqlBulk.AppendFormat(query, p0, p1, p2, p3);

        if (currRow == maxRows || totalRows == gvStockTake.Rows)
        {
            using (var con = new SqlConnection(connectionString))
            {
                using (var cmd = new SqlCommand(sqlBulk.ToString(), con))
                {
                    cmd.Parameters.AddRange(paramList);
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            currRow = 0;
            counter = 0;
            paramList.Clear();
            sqlBulk.Length = 0;
        }

    }

}