首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >raiserror:从c#存储过程中捕获raiserror()消息

raiserror:从c#存储过程中捕获raiserror()消息
EN

Stack Overflow用户
提问于 2012-04-24 17:57:45
回答 1查看 5.8K关注 0票数 2

我正在尝试使用C#作为我选择的编程语言来理解ASP.NET 4.0。我是一个很好的SQL开发人员,所以我计划用SQL做我的大部分业务逻辑。应用程序将仅通过存储过程与数据库交互。

在aspx页面中,我有一个数据源,用于填充调用sp 'season_get_byID‘的数据视图和用于采用多个参数的更新'season_update’,

aspx源代码显示

代码语言:javascript
复制
    <asp:SqlDataSource ID="dsDetail" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ADR %>" 
        SelectCommand="season_get_by_ID" SelectCommandType="StoredProcedure" 
        UpdateCommand="season_Update" UpdateCommandType="StoredProcedure">
        <SelectParameters>
            <asp:ControlParameter ControlID="GridView1" Name="ID" 
        PropertyName="SelectedValue" Type="Int32" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="ID" Type="Int32" />
            <asp:Parameter Name="Code" Type="String" />
            <asp:Parameter Name="Description" Type="String" />
            <asp:Parameter DbType="Datetime" Name="StartDate" />
            <asp:Parameter DbType="Datetime" Name="EndDate" />
            <asp:Parameter Name="isActive" Type="Byte" />
            <asp:Parameter Name="isCurrent" Type="Byte" />
        </UpdateParameters>
    </asp:SqlDataSource>

其中每个asp:参数映射到存储过程中的@Param参数-到目前为止还不错

存储的proc在尝试执行更新之前执行一些验证。如果验证失败,则引发RAISERROR(@errmsg,10,1)。

我不能确定的是,在aspx.cs代码背后的文件中,我会尝试捕获错误的位置,以及语法应该是什么:它是否应该在after_update事件处理程序中,如果是,它似乎不是e.exception的一部分。我知道这个例程中的一些验证可以使用验证类来完成,但这是一个操作环境的学习练习,而不是最终的产品代码,也就是说,我试图理解什么是可能的,而不是什么是“正确的”。

存储过程的文本如下所示。

代码语言:javascript
复制
ALTER Procedure [dbo].[season_Update] 
    (
        @ID int,
        @Code nvarchar(10), 
    @Description nvarchar(50), 
    @StartDate date, 
    @EndDate date, 
    @isActive tinyint, 
    @isCurrent tinyint
)
as
DECLARE @ERR nvarchar(max) = ''

IF (SELECT count(*) FROM season WHERE ID = @ID) = 0 
BEGIN
SET @ERR = @ERR + '|Season Doesn''''t exist'
END

/*validate that season code and description are not blank*/
IF (@Code is null 
or
ltrim(rtrim(@Code)) = ''
)
BEGIN
set @ERR =+ '|Season Code cannot be blank'
END

IF @ERR = ''
BEGIN
IF (@Description is null 
    or
    ltrim(rtrim(@Description)) = ''
    )
BEGIN
    set @ERR =+ '|Season Description cannot be blank'
END

/*validate that the season code does not already exist on a different ID*/
IF (SELECT count(*) FROM season WHERE Code = ltrim(rtrim(upper(@CODE))) and 
       ID <> @ID) > 0 
BEGIN
    SET @ERR =+ '|Season Code ' + @Code + 'already exists'
END

/*validate that the start date is before the end date*/
IF @Startdate > @Enddate
BEGIN
    SET @ERR =+ '|Start Date cannot be Before End Date'
END
END

IF @ERR = ''
BEGIN
BEGIN TRY
UPDATE Season
    SET Code = ltrim(rtrim(upper(@Code))), 
        Description = Ltrim(rtrim(@Description)), 
        StartDate = @StartDate, 
        EndDate = @EndDate, 
        isActive = @isActive, 
        isCurrent = @isCurrent
WHERE
        ID = @ID    
END TRY
BEGIN CATCH
RAISERROR(N'There was a problem',10,1)
END CATCH
END

IF @ERR <> ''
BEGIN
RAISERROR(@ERR,10,1)
END
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-24 18:01:46

微软有一篇关于这方面的文章,How to Retrieve Values in SQL Server Stored Procedures,尽管是Visual Basic的。这应该会给你一个关于如何解决问题的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10295645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档