ASP.NET 如何catch存储过程中抛出的异常信息?

修改资料库的时候,我们要做一些判定,比如输入的资料不能为空、资料已存在或与其它表的资料关联不能删除等等。

输入的资料不能为空,这些都直接交由逻辑层去处理,而资料已存在呀、关联呀等等,这部分推荐让数据层去执行,但怎么返回提示信息并提示用户呢?catch是个不错的选择!

当你要新增一笔资料的时候,不要做类似于“Sql = Insert into [tableName] values(....);"这样的处理,直接调用存储过程就好了,假定存储过程的名称为[test_prc]

那它的代码类似于下面这样子:

 1  CREATE PROCEDURE [dbo].[test_prc](
 2    @formNo nvarchar(20),  --单号
 3    @formName nvarchar(10) --名称
 4  )
 5  AS 
 6  BEGIN
 7    declare
 8    
 9      @Error_Msg nvarchar(200)
10    
11    --检查是否为空值
12    IF ISNULL(@formNo,'')='' or ISNULL(@formName,'')='' 
13    BEGIN
14      set @Error_Msg = '单号、名称等不能为空值'
15      RAISERROR(@Error_Msg,16,1) WITH NOWAIT
16      return 1
17    END
18    
19    --检查程序文件是否存在
20    IF exists (select 1 from [tableName] where formNo=@formNo and formName=@formName)
21    BEGIN
22      set @Error_Msg = '单号'+@formNo+',名称'+@formName+'已存在,不允许增加'
23      RAISERROR(@Error_Msg,16,1) WITH NOWAIT
24      return 1
25    END
26      
27    
28    --新增
29    INSERT INTO [tableName]
30             ([formNo]
31             ,[formName]
32             )
33       VALUES
34             (@formNo
35             ,@formName
36             )
37  END      

有了以上代码之后,那我们就在程序中使用try...catch对这些异常信息做捕捉处理,如下:

 1         #region 成员方法
 2         /// <summary>
 3         /// 添加资料
 4         /// </summary>
 5         /// <param name="formNo">单号</param>
 6         /// <param name="formName">名称</param>
 7         /// <returns></returns>
 8         public bool Do_Process_Add_Info(string formNo, string formName)
 9         {
10             bool result = true;
11             SqlParameter[] oSqlParameter =
12                   {                                       
13                      new SqlParameter("@formNo",SqlDbType.NVarChar,20) ,
14                      new SqlParameter("@formName",SqlDbType.NVarChar,10) 
15                     };
16             try
17             {
18                 //赋值
19                 oSqlParameter[0].Value = formNo;
20                 oSqlParameter[1].Value = formName;
21 
22                 sqlHelper.SP_ExecuteNonQuery("test_prc", oSqlParameter); //sqlHelper是实例化的用于操作数据库的实例!
23             }
24             catch (Exception err)
25             {
26                 result = false;
27                 System.Windows.Forms.MessageBox.Show(err.Message);
28                 //或者在网页中弹框
29                 //Response.Write(err.Message);
30             }
31             return result;
32         }

好了,通过这样子,只要调用这个 Do_Process_Add_Info(string formNo, string formName) 方法就可以了,什么代码逻辑都不用修改,应该有的提示它全有了,呵呵。不知道触发器上面能不能这样子搞呢,呵呵。