SQL2005建立两个存储过程,无参数,有参数
1.当对一张表同时插入10条数据时,在插入到第9条时,报错; 
2.事务回滚 (之前插入数据取消)
3.抛出自定义异常 
4.C# 如何实现获取抛出的异常

解决方案 »

  1.   


    --just a example:
    go
    create proc pro_test
    as
    begin transaction 
    insert table
    select ......
    if @@error<>0
    begin
    print ‘错误信息:'+ltrim(@@error)
    rollback transaction
    end
    else
    begin
    commit transaction
    end
      

  2.   


    --如果想得到具体的错误信息,可以试试try catch,具体语法如下
    返回导致 TRY…CATCH 构造的 CATCH 块运行的错误的消息文本。 Transact-SQL 语法约定语法
     
    ERROR_MESSAGE ( ) 
     返回类型
    nvarchar(2048) 返回值
    在 CATCH 块中调用时,返回导致 CATCH 块运行的错误消息的完整文本。该文本包括为所有可替换参数提供的值,如长度、对象名或时间。如果在 CATCH 块作用域以外调用,则返回 NULL。备注
    ERROR_MESSAGE 可以在 CATCH 块作用域内的任意位置调用。ERROR_MESSAGE 无论运行多少次,无论在 CATCH 块作用域内的什么位置运行,它都返回错误消息。这与 @@ERROR 之类的函数形成鲜明对比,后者这样的函数只能在紧接导致错误的语句后面的下一个语句中返回错误号,或者在 CATCH 块的第一个语句中返回错误号。在嵌套 CATCH 块中,ERROR_MESSAGE 返回特定于它被引用 CATCH 块作用域的错误消息。例如,外部 TRY...CATCH 构造的 CATCH 块可能具有嵌套 TRY...CATCH 构造。在嵌套 CATCH 块中,ERROR_MESSAGE 返回调用该嵌套 CATCH 块的错误消息。如果 ERROR_MESSAGE 在外部 CATCH 块中运行,它将返回调用该外部 CATCH 块的错误消息。示例
    A. 在 CATCH 块中使用 ERROR_MESSAGE
    下面的代码示例显示生成被零除错误的 SELECT 语句。将返回错误消息。 复制代码 
    USE AdventureWorks;
    GOBEGIN TRY
        -- Generate a divide-by-zero error.
        SELECT 1/0;
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS ErrorMessage;
    END CATCH;
    GO
     B. 在 CATCH 块中将 ERROR_MESSAGE 与其他错误处理工具一起使用
    下面的代码示例显示生成被零除错误的 SELECT 语句。同时返回错误消息和有关错误的信息。 复制代码 
    USE AdventureWorks;
    GOBEGIN TRY
        -- Generate a divide-by-zero error.
        SELECT 1/0;
    END TRY
    BEGIN CATCH
        SELECT
            ERROR_NUMBER() AS ErrorNumber
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_STATE() AS ErrorState
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage;
    END CATCH;
    GO
     
      

  3.   

    可以在存储过程中加一个output的参数,让C#得到这个参数的实际值.
      

  4.   

    2楼 用try catch 可否写明具体代码如何实现 谢谢
      

  5.   


    go
    if object_id('test','u')is not null
    drop table test
    go
    create table test(
    id int identity(1,1),
    value varchar(10) check(isnumeric(value)=1)
    )
    go
    if OBJECT_ID('pro_test')is not null
    drop proc pro_test
    go
    create proc pro_test 
     @value1 varchar(10),
     @value2 varchar(10), 
     @value3 varchar(10),
     @ErrorMessage  varchar(2048) output
    as
    begin transaction
    begin try
    insert test(value)
    select @value1 union all
    select @value2 union all
    select @value3
    end try
    begin catch
     SELECT @ErrorMessage=ERROR_MESSAGE()
    end catch
    if @ErrorMessage is not null 
    begin
    select @ErrorMessage as ENDMessage
    rollback transaction 
    end
    else
    begin
    select '插入成功' as ENDMessage
    commit transaction
    end
    --演示插入失败
    go
    declare @ErrorMessage varchar(2048)
    exec pro_test '12345','af345','90dg',@ErrorMessage output  
    /*
    ENDMessage
    INSERT 语句与 CHECK 约束"CK__test__value__02DD43D9"冲突。
    该冲突发生于数据库"master",表"dbo.test", column 'value'。
    */--演示插入成功
    go
    declare @ErrorMessage varchar(2048)
    exec pro_test '12345','56324','8956',@ErrorMessage output  
    /*
    ENDMessage
    插入成功
    */select * from test/*
    id value
    1 12345
    2 56324
    3 8956
    */--刚刚回来,写了一个例子,不知道符合你的要求么
      

  6.   

    写成存储过程
    同时加上try catch