如何清除数据库异常
How to clear database exception
如果用户没有出错,代码运行完美,但是,如果出现错误,程序不会崩溃,但它不会执行任何其他它被编程要做的事情。当我再次单击添加时,当我的程序将更改保存到数据库时,它会跳转到我的 catch 语句而不保存。捕获错误后如何清除错误以便我可以将另一个用户添加到数据库?
为了更清楚:
假设你在textbox
中输入Test,一打开程序就在textbox
中测试。你会得到这个异常
InnerException = {"Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (Test, Test).The statement has been terminated."}.
如果您随后尝试输入 Check,Check 您将得到异常
InnerException = {"Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (Test, Test).The statement has been terminated."}.
如果更改了名称,为什么我会收到同样的错误。调试时,如果您检查正在使用的名称:db.Users.Add(user)
它显示 Check,Check 所以它不像它没有改变 user.Name
try
{
if (addNameTextBox.Text.Trim().Length == 0 || addTitleTextBox.Text.Trim().Length == 0)
return;
var user = new User();
user.Name = addNameTextBox.Text.Trim();
user.Title = addTitleTextBox.Text.Trim();
db.Users.Add(user);
db.SaveChanges();
addNameTextBox.Text = "";
addTitleTextBox.Text = "";
AutoCompleteNameTextBox();
}
catch (System.Data.Entity.Infrastructure.DbUpdateException)
{
databaseErrorLabel.Visible = true;
databaseErrorLabel.Text = "User with this name is already in database";
}
这一切归结为 "how to roll back additions in EF on exception"。
除非您使用全新的数据库上下文实例重新开始,否则您需要回滚对用户实体的添加:
保留对添加的用户对象的引用,并在异常时设置其 EntityState = EntityState.Detached
。
如果用户没有出错,代码运行完美,但是,如果出现错误,程序不会崩溃,但它不会执行任何其他它被编程要做的事情。当我再次单击添加时,当我的程序将更改保存到数据库时,它会跳转到我的 catch 语句而不保存。捕获错误后如何清除错误以便我可以将另一个用户添加到数据库?
为了更清楚:
假设你在textbox
中输入Test,一打开程序就在textbox
中测试。你会得到这个异常
InnerException = {"Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (Test, Test).The statement has been terminated."}.
如果您随后尝试输入 Check,Check 您将得到异常
InnerException = {"Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (Test, Test).The statement has been terminated."}.
如果更改了名称,为什么我会收到同样的错误。调试时,如果您检查正在使用的名称:db.Users.Add(user)
它显示 Check,Check 所以它不像它没有改变 user.Name
try
{
if (addNameTextBox.Text.Trim().Length == 0 || addTitleTextBox.Text.Trim().Length == 0)
return;
var user = new User();
user.Name = addNameTextBox.Text.Trim();
user.Title = addTitleTextBox.Text.Trim();
db.Users.Add(user);
db.SaveChanges();
addNameTextBox.Text = "";
addTitleTextBox.Text = "";
AutoCompleteNameTextBox();
}
catch (System.Data.Entity.Infrastructure.DbUpdateException)
{
databaseErrorLabel.Visible = true;
databaseErrorLabel.Text = "User with this name is already in database";
}
这一切归结为 "how to roll back additions in EF on exception"。
除非您使用全新的数据库上下文实例重新开始,否则您需要回滚对用户实体的添加:
保留对添加的用户对象的引用,并在异常时设置其 EntityState = EntityState.Detached
。