【发布时间】:2018-04-11 20:04:40
【问题描述】:
我不断收到错误消息
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# 代码中登录的代码
protected void btnLogin_Click(object sender, EventArgs e)
{
using (SqlConnection sqlCon = new SqlConnection(@"Data Source=(local)\;Initial Catalog=SmallBatch;Integrated Security=True;"))
{
sqlCon.Open();
string query = "SELECT COUNT(1) FROM Site WHERE Username=@username AND Password=@password";
SqlCommand sqlCmd = new SqlCommand(query, sqlCon);
sqlCmd.Parameters.AddWithValue("@username", txtUsername.Text.Trim());
sqlCmd.Parameters.AddWithValue("@password", txtPassword.Text.Trim());
int count = Convert.ToInt32(sqlCmd.ExecuteScalar());
if (count == 1)
{
Session["username"] = txtUsername.Text.Trim();
Response.Redirect("Dashboard.aspx");
}
else
{
lblErrorMessage.Visible = true;
}
}
}
我还是 ASP.NET 和 C# 的新手,所以任何建议都非常感谢!
【问题讨论】:
-
而不是
cmd.Parameters.Clear();为什么不直接重置值呢?另外,你做cmd.Parameters.AddWithValue("@Username",...然后你清除它 -
您的查询包含两个不同的插入语句 - 我觉得这些应该单独执行?这可能是问题所在。
-
@jocull 不是真的。他可以做到。实际上,可能只是将参数收集到一个大块中,而不是单独执行单独的插入。这样一来,DB就只有一趟了。取决于,总负载有多大
-
SqlCommand和SqlConnection都是一次性的,所以都应该在using块中。连接的 Dispose(当它退出 using 块时)处理关闭,因此您不需要。我建议看看Can we stop using AddWithValue。 -
清除参数集合将清除您的用户名(在循环之前设置)。你是这个意思吗?