C# C“Error必须声明标量变量”@EmpID“;SQL插入
我已经在这个问题上纠缠了好几个星期,我在论坛上到处尝试解决其他人遇到的同一个问题,但到目前为止它仍然不起作用。我不确定我做错了什么 我正在制作一个用户交互页面,当单击按钮保存数据时,该页面获取数据并将其提交/插入SQL数据库 EmpID是来自生成用户雇员ID的文本框的数据。EmpID随后作为EmployeeID值存储在SQL数据库中 当我运行它并试图保存数据时,我不断得到错误 必须声明标量变量“@EmpID”C# C“Error必须声明标量变量”@EmpID“;SQL插入,c#,sql,variables,scalar,C#,Sql,Variables,Scalar,我已经在这个问题上纠缠了好几个星期,我在论坛上到处尝试解决其他人遇到的同一个问题,但到目前为止它仍然不起作用。我不确定我做错了什么 我正在制作一个用户交互页面,当单击按钮保存数据时,该页面获取数据并将其提交/插入SQL数据库 EmpID是来自生成用户雇员ID的文本框的数据。EmpID随后作为EmployeeID值存储在SQL数据库中 当我运行它并试图保存数据时,我不断得到错误 必须声明标量变量“@EmpID” void UpdateInternal0() { 尝试 { 使用(SqlConnect
void UpdateInternal0()
{
尝试
{
使用(SqlConnection con=newsqlconnection(Properties.Settings.Default.adminConnectionString))
{
con.Open();
foreach(InternalGrid0.SelectedItems中的DataRowView drv)
{
数据行行=drv.row;
bool isSelected=Convert.ToBoolean(drv.Row[0]);
如果(当选)
{
string sqlString=“插入ChecklistTransitionTable(RelatedEmployeeID,RelatedDocIdx)”+
“值(@EmpID,@DOC_Number)”;
使用(SqlCommand cmd=newsqlcommand(sqlString,con))
{
for(int i=0;i
您正在执行两次查询。
第一次使用ExecuteScalar()
,然后清除参数值并在ExecuteNonQuery()调用中重新执行查询(现在没有参数值)。后者抛出异常
也许这个修改过的版本会按预期工作
void UpdateInternal0(int employeeId)
{
try
{
using (SqlConnection con = new SqlConnection(Properties.Settings.Default.adminConnectionString))
{
con.Open();
foreach (DataRowView drv in InternalGrid0.SelectedItems)
{
DataRow row = drv.Row;
bool isSelected = Convert.ToBoolean(drv.Row[0]);
if (isSelected)
{
string sqlString = "INSERT INTO ChecklistTransitionTable (RelatedEmployeeID, RelatedDocIdx) VALUES (@EmpID, @DOC_Number)";
using (SqlCommand cmd = new SqlCommand(sqlString, con))
{
for (int i = 0; i < InternalGrid0.Columns.Count; i++)
{
int DocIdx = 0;
try {
DocIdx = (int)drv.Row[i];
} catch (InvalidCastException ice) {
// You should handle this here...
}
cmd.Parameters.AddWithValue("@EmpID", employeeId);
cmd.Parameters.AddWithValue("@DOC_Number", DocIdx);
int result = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
Console.WriteLine("Test");
//Check Error
if (result < 0)
{
System.Windows.Forms.MessageBox.Show("Error inserting data into database!");
}
}
}
}
}
}
System.Windows.Forms.MessageBox.Show("Employee data successfully updated.");
}
catch (SqlException ex)
{
System.Windows.Forms.MessageBox.Show(string.Format("\nMessage ---\n{0}", ex.Message));
}
}
private void BtnGridUpdate_Click(object sender, EventArgs e)
{
int employeeID = Convert.ToInt32(EmpID.Text);
UpdateInternal0(employeeID);
}
void UpdateInternal0(int-employeeId)
{
尝试
{
使用(SqlConnection con=newsqlconnection(Properties.Settings.Default.adminConnectionString))
{
con.Open();
foreach(InternalGrid0.SelectedItems中的DataRowView drv)
{
数据行行=drv.row;
bool isSelected=Convert.ToBoolean(drv.Row[0]);
如果(当选)
{
string sqlString=“插入ChecklistTransitionTable(RelatedEmployeeID,RelatedDocIdx)值(@EmpID,@DOC_Number)”;
使用(SqlCommand cmd=newsqlcommand(sqlString,con))
{
for(int i=0;i
你说过EmployeeID
来自一个TextBox
。ID
是以字符串还是int的形式存储在数据库中?@daShier EmployeeID是以int的形式存储的,TextBox ID是EmpID。这就是为什么我有行'int EmployeeID=Convert.ToInt32(EmpID.Text);转换它。此外,错误是正确的。您正在执行命令(cmd.ExecuteScalar()
),正在清除参数(cmd.parameters.Clear()
),然后再次执行命令(cmd.ExecuteNonQuery()
)。再次执行命令时,该参数已丢失。此外,此代码行int EmployeeID=Convert.ToInt32(EmpID.Text);
会发出警报。如果用户在文本框中输入Damon
,会发生什么情况?运行此代码会给我一个不同的错误-System.InvalidCastException:“指定的强制转换不是val?”