繁体   English   中英

添加错误处理以从数据库中删除用户

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM