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