我想在我的代码中添加错误处理,这样如果在我的数据库中找不到用户名和密码,就会出现错误消息。我使用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(" ");
}
感谢任何帮助人员
答案 0 :(得分:0)
我没有您的查询文字,但如果它是一个简单的DELETE
语句,您可以尝试这样的事情:
var myAffectedRows = cmdData.ExecuteNonQuery();
if (myAffectedRows > 0)
{
MessageBox.Show("Something was deleted");
}
else
{
MessageBox.Show("Nothing was deleted");
}
答案 1 :(得分:0)
但是你的问题和你的代码并不匹配,但我可以从你的代码中理解你需要这样的东西
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
答案 2 :(得分:0)
无法找到“用户记录”的情况是逻辑错误。通常,如果找不到某个记录,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。请查看this MSDN page以获取更多信息。
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
块中包含对此方法的调用,并在MessageBox
块中显示catch
。例如:
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和其他一些数据,它们会影响应用程序执行性能。