[英]Adding error handling to deleting a user from a database
我想在我的代码中添加错误处理,这样如果在我的数据库中找不到用户名和密码,就会出现错误消息。 我没有太多的尝试使用try...catch
我从db中删除用户的代码工作正常,这是我使用的:
string constring = databaselocation
SqlConnection conData = new SqlConnection(constring);
SqlCommand cmdData = new SqlCommand(query, conData);
SqlDataReader myReader;
try
{
conData.Open();
myReader = cmdData.ExecuteReader();
MessageBox.Show("member has been deleted");
while (myReader.Read())
{
}
}
catch (Exception)
{
MessageBox.Show(" ");
}
谢谢你的帮助
我没有您的查询文本,但如果它是一个简单的DELETE
语句,您可以尝试这样的事情:
var myAffectedRows = cmdData.ExecuteNonQuery();
if (myAffectedRows > 0)
{
MessageBox.Show("Something was deleted");
}
else
{
MessageBox.Show("Nothing was deleted");
}
但是你的问题和你的代码不匹配,但我可以从你的代码中理解你需要这样的东西
string constring = databaselocation
SqlConnection conData = new SqlConnection(constring);
SqlCommand cmdData = new SqlCommand(query, conData);
SqlDataReader myReader;
try
{
conData.Open();
// I am assuming here you are trying to access user/password
myReader = cmdData.ExecuteReader();
// and then you want to verify if you receive any row for that combination
if(myReader != null && myReader.HasRows)
{
// then your record deletion code should go here
// ...
// ...
MessageBox.Show("member has been deleted");
}
else
{
throw new Exception("Username and password is wrong! Cannot delete record");
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
注意:这不是实现此目的的最佳方法,但我只想使用try.. catch...
编写代码,具体提到。 没有实际需要try... catch
这里
“无法找到用户记录”的情况是逻辑错误。 通常,如果找不到某个记录,SqlClient将不会产生异常。 所以,你不能在抓住它catch
块。
但是,如果无法找到Table,View等对象,或者查询中出现语法错误,SqlClient将产生异常。 您可以检查MSDN以查找所有可能的SqlClient异常。
虽然, ExecuteReader()
可以执行DELETE
查询,但您不需要结果集。 这是使用ExecuteNonQuery()
的更好方法。 此方法返回一个整数,该整数告诉您执行查询所影响的记录数。
要处理“无法找到记录”,您需要实现自己的逻辑。 例如,以下代码将删除具有给定ID的记录,如果无法删除则会触发异常。
private void DeleteUser(int userId)
{
string deleteCommandText = @"DELETE FROM MyUsers WHERE Id = @id";
using(SqlConnection conn = new SqlConnection("your_connection_string_here"))
{
if(conn.ConnectionState != ConnectionState.Open) conn.Open();
using(SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = deleteCommandText ;
cmd.Parameters.AddWithValue("@Id", userId);
int resultRowCount;
resultRowCount = cmd.ExecuteNonQuery();
if(resultRowCount <= 0)
throw new UserNotFoundException("Cannot delete User record, no record found");
}
if(conn.ConnectionState != ConnectionState.Closed) conn.Close();
}
}
此外,您可以定义自己的异常,例如UserNotFoundException。 查看此MSDN页面以获取示例和更多信息。
UserNotFoundException的一个示例
using System;
public class UserNotFoundException: Exception
{
public UserNotFoundException()
{
}
public UserNotFoundException(string message)
: base(message)
{
}
public UserNotFoundException(string message, Exception inner)
: base(message, inner)
{
}
}
现在,您可以在try...catch
块中包含对此方法的调用,并在catch
块中显示MessageBox
。 例:
private void deleteUser_Click(object sender, EventArgs e)
{
try
{
DeleteUser(userId: 5);
MessageBox.Show("User deleted");
}
catch(UserNotFoundException ex)
{
MessageBox.Show("Cannot delete user");
}
}
最后
当错误对应用程序逻辑不重要时,尽量避免抛出异常(自定义或不自定义),因为异常带有StackTrace和其他一些数据,它们会影响应用程序执行性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.