有数据库school中的两个表student,course,结构如下:
student表
主键:stu_id
stu_name
外键:course_id
course表
主键:course_id
course_name
问题:
当关联表带外键约束时,册除父表项时,由于其关联子表尚不为空,就会出错:
“DELETE 语句与 COLUMN REFERENCE 约束 'FK student_ course ' 冲突。该冲突发生于数据库 'school',表 'student', column 'course_id'。语句已终止。”
处理:
使用两个GridView,勾选“使用删除”选项,以及它的数据源的高级选项中勾先“生成INSERT,UPDATE和DELETE语句”
如果只是这样设置,删除时就会出上面的错误提示,如何不弹出这个系统提示,而弹出自己设置的提示信息,以下是一个可行的办法:
1.数据源控件,提供了事务和错误的处理方法,事务方法加入如下代码:
加入命名空间:imports System.Data.Common
2.在数据源控件的deleting事件中加入:
'这是事务的定义
Dim cmd As DbCommand = e.Command
Dim conn As DBconnection = cmd.connection
conn.Open()
Dim tran As DbTransaction = conn.BeginTransaction()
cmd.Transaction = tran
3.在在数据源控件的deleted事件中加入:
'这是事务的处理
If (e.Exception Is Nothing) Then
e.Command.Transaction.Commit()
‘ MsgBox("删除成功!")
Response.Write(" <script> alert( '删除成功!'); </script> ")
Else
e.Command.Transaction.Rollback()
e.ExceptionHandled = True ‘这行要加,表示错误已处理,否则错误会继续传下去,还是会出现上面的错误提示
Response.Write(" <script> alert( '下级子菜单未空,不能删除主菜单!'); </script> ")
‘MsgBox("下级子菜单未空,不能删除主菜单!") '这个在VS的调试时(服务器端)可以弹出提示窗,正常使用时出错!
End If
参考:
1. e.Exception --表示增加时发生的异常对象,如果在调用的目标对象上发生异常,查看InnerException对象以取得更多信息。
2. e.ExceptionHandled --表示是否将异常标记为已处理,如果设为true,异常不会传到后面的事件中去。
3. e.ReturnValue --表示你在object data source上设置的InsertMethod返回的值,可以通过此值检查是否成功。
补充:
4. e.ExceptionHandled --表示是否将异常标记为已处理,如果设为true,异常不会传到后面的Page.Error事件中去。否则如果定义了Page.Error事件,先执行Page.Error事件,如果Page.Error没有执行Server.ClearError()方法,异常再传入Application_Error事件中去.未定义Page.Error事件处理程序时,直接传入Application_Error事件中。5. e.KeepInEditMode --是否保持Edit模式中,通常如果出错,我们会显示一个错误信息,保持在Edit模式方便用户修改。