C# 更新查询未引发错误
提前谢谢你的帮助 我试图在C语言中使用更新查询# 错误:即使我使用了不正确的值,也会执行命令 代码:C# 更新查询未引发错误,c#,sql,sql-update,C#,Sql,Sql Update,提前谢谢你的帮助 我试图在C语言中使用更新查询# 错误:即使我使用了不正确的值,也会执行命令 代码: 如果您输入了“不正确”的值,它只会更新零个记录。此处不应出现错误/异常。您的代码看起来会更好,它不是最理想的,但它已经是一段比您的代码片段更好的代码 1) 使用辅助函数为sql注入问题添加了参数 2) ExecuteOnQuery返回受影响的行,因此如果您希望更新1行,可以检查该行 3) 如果您使用不存在的id更新一行,它将不会像您在代码中所期望的那样引发SqlException,例如在发生锁
如果您输入了“不正确”的值,它只会更新零个记录。此处不应出现错误/异常。您的代码看起来会更好,它不是最理想的,但它已经是一段比您的代码片段更好的代码 1) 使用辅助函数为sql注入问题添加了参数 2) ExecuteOnQuery返回受影响的行,因此如果您希望更新1行,可以检查该行 3) 如果您使用不存在的id更新一行,它将不会像您在代码中所期望的那样引发SqlException,例如在发生锁定时会发生这种情况
public void Update()
{
var con = new SqlConnection();
try
{
var empId = TxtEMPID.Text
var avayaId = TxtAvayaID.Text
con.Open();
var cmd1 = new SqlCommand("update Comcast_AvayaID set Status='Inactive' where Employee_Id=@empId and AvayaID = @avayaId", con);
cmd1.Parameters.Add(AddParameter("@empId",empId));
cmd1.Parameters.Add(AddParameter("@avayaId", avayaId));
var cmd2 = new SqlCommand("UPDATE Avaya_Id SET Status = 'UnAssigned' where Avaya_ID =avayaId", con);
cmd2.Parameters.Add(AddParameter("@avayaId", avayaId));
var rowsaffected1 = cmd1.ExecuteNonQuery();
var rowsAffected2 = cmd2.ExecuteNonQuery();
if (rowsaffected1 == 1 && rowsAffected2 == 1)
{
//success code goes here
//--------
LBLSuccess.Visible = true;
LBLSuccess.Text = "Deactivation Successfull";
}
else
{
// failure code goes here
//-----------------------
LBLSuccess.Visible = true;
LBLSuccess.Text = "Deactivation Unsuccessfull";
}
}
catch (SqlException ex)
{
//handle errors
}
finally
{
con.Close();
}
Console.ReadLine();
}
private SqlParameter AddParameter(string name, object value) {
var par = new SqlParameter();
par.ParameterName = name;
par.Value = value;
return par;
}
您的代码极易受到SQL注入攻击。使用参数化查询!您所说的
错误值是什么意思?是否要添加输入验证?在获得异常时,请写出ex.message属性,而不是编写无用的消息。这将是必要的,以了解这里发生了什么(当然,告诉我们你们在那个里得到了什么),你们为什么要把你们不想传递给用户的消息@史蒂夫没有按照之前的评论做。SqlException可以是关于任何内容的,用户不确定是否应该看到它,如果您显示它,它可以是+1到+1threat@EugeneGorbovoy我们正试图调试它的问题。如果他可以将异常写入日志文件,但为了了解发生了什么,那么最好让异常可见。在生产代码中,如果不打算处理异常处理程序,则根本没有异常处理程序。该解决方案非常有效。但是为什么这个函数使用私有的Sql参数Addi形形参(String name,Objor value){var PAR=NeXQualPosiple(),PAR.NealErrname=name;Pal.Value=value;返回PAR;}它只是一个帮助函数,因为没有默认构造函数来创建具有名称和值的SqlParameter。通过使用此选项,您将获得更干净的代码和更少的重复。我使用这些参数来防止查询中的SQL注入,就像您的示例所做的一样。有关SQL的更多信息,请参阅injection@BenCroughs我们已经很久很久了。但是,在添加参数时,最好指定其类型和大小。@Steve thx忘记了这一点,有时我仍然是老派:-)但实际上,通过帮助函数,您可以轻松添加类型和大小为什么要放置catch(SqlException)-您希望在这里出现哪些异常?
public void Update()
{
var con = new SqlConnection();
try
{
var empId = TxtEMPID.Text
var avayaId = TxtAvayaID.Text
con.Open();
var cmd1 = new SqlCommand("update Comcast_AvayaID set Status='Inactive' where Employee_Id=@empId and AvayaID = @avayaId", con);
cmd1.Parameters.Add(AddParameter("@empId",empId));
cmd1.Parameters.Add(AddParameter("@avayaId", avayaId));
var cmd2 = new SqlCommand("UPDATE Avaya_Id SET Status = 'UnAssigned' where Avaya_ID =avayaId", con);
cmd2.Parameters.Add(AddParameter("@avayaId", avayaId));
var rowsaffected1 = cmd1.ExecuteNonQuery();
var rowsAffected2 = cmd2.ExecuteNonQuery();
if (rowsaffected1 == 1 && rowsAffected2 == 1)
{
//success code goes here
//--------
LBLSuccess.Visible = true;
LBLSuccess.Text = "Deactivation Successfull";
}
else
{
// failure code goes here
//-----------------------
LBLSuccess.Visible = true;
LBLSuccess.Text = "Deactivation Unsuccessfull";
}
}
catch (SqlException ex)
{
//handle errors
}
finally
{
con.Close();
}
Console.ReadLine();
}
private SqlParameter AddParameter(string name, object value) {
var par = new SqlParameter();
par.ParameterName = name;
par.Value = value;
return par;
}