触发器代码如下:
实现的功能为:
Light表删除记录
则Room表的LightNum字段值则相应改变CREATE TRIGGER UpdateRoom_LightNum_DelTri ON Light
AFTER DELETE 
AS
DECLARE @RoomNo nvarchar(10),@LightNum int,@LightNo nvarchar(10)Select @LightNo = LightNo from DELETED
Select @RoomNo = RoomNo from  DELETED Where LightNo = @LightNo 
BEGIN
Update Room Set LightNum = LightNum - 1 Where RoomNo = @RoomNo
END删除的存储过程代码如下:
实现功能:
删除记录成功则返回1否则返回0CREATE PROCEDURE DelLightRecord --创建视图
(
@LightNo nvarchar(10)
)
AS
Declare @ReturnValue bit 
BEGIN TRANSACTION Del_LightRecord --开始执行事务IF @LightNo NOT IN (SELECT LightNo FROM Light) --判断表里面是否有该条记录
BEGIN ROLLBACK TRANSACTION Del_LightRecord SET @ReturnValue = 0
RETURN @ReturnValue   END
ELSE  --否则,执行修改另一个表的记录
BEGIN
DELETE  FROM Light WHERE LightNo=@LightNo COMMIT TRANSACTION Del_LightRecord  --提交事务 SET @ReturnValue = 1
RETURN @ReturnValue   END
select  @LightNo=@@Identity
GO
现在的问题是:触发器和存储过程好像有冲突!
删除了触发器则存储过程返回值正常,添加了触发器之后,总是会返回0,并继续执行下面的代码!
现在一头雾水。。
高手们,拜托告诉我为什么?

解决方案 »

  1.   

    Select @LightNo = LightNo from DELETED
    Select @RoomNo = RoomNo from  DELETED Where LightNo = @LightNo 
    这是?????Select @RoomNo = RoomNo from  DELETED这样不对?
    CREATE TRIGGER UpdateRoom_LightNum_DelTri ON Light
    AFTER DELETE 
    AS    Update Room Set LightNum = LightNum - 1 Where RoomNo = (SELECT 
    RoomNo  FROM DELETE)
      

  2.   

    触发器有问题deleted是结果集怎么可以赋给变量
      

  3.   

    CREATE TRIGGER UpdateRoom_LightNum_DelTri ON Light
    AFTER DELETE 
    AS
    UPDATE Room
    SET LightNum = R.LightNum - 1
    FROM Room R,DELETED d 
    WHERE R.RoomNo=d.RoomNo一條條刪除時,可改為以上觸發器
      

  4.   

    CREATE TRIGGER UpdateRoom_LightNum_DelTri ON Light
    AFTER DELETE 
    AS
    BEGIN
        Update Room Set LightNum = LightNum - 1 
        Where RoomNo IN(SELECT RoomNo FROM DELETED)
    END--
    CREATE PROCEDURE DelLightRecord --创建视图
    (
        @LightNo nvarchar(10)
    )
    AS
    IF NOT EXISTS(SELECT 1 FROM Light WHERE LightNo=@LightNo) --判断表里面是否有该条记录
        RETURN 0
    ELSE             --否则,执行修改另一个表的记录
    BEGIN
        DELETE  FROM Light WHERE LightNo=@LightNo
        RETURN 1
    END
      

  5.   

    存儲過程select  @LightNo=@@Identity--這個賦值不正確吧
      

  6.   

    CREATE TRIGGER UpdateRoom_LightNum_DelTri ON Light
    AFTER DELETE  
    AS  Update Room Set LightNum = LightNum - 1 Where RoomNo  IN (SELECT  
    RoomNo FROM DELETE)
    这里忘改了
      

  7.   

    本帖最后由 roy_88 于 2010-06-21 16:11:50 编辑
      

  8.   

    不行啊!用了你的方法还是出现那样的问题,明明已经删除的记录老是返回0然后又继续执行了下面的SQL代码。
      

  9.   

    由于持有很大的怀疑我测试了一番,没有看出问题
    if object_id('Light')is not null drop table Light
    go
    create table Light(LightNo  nvarchar(10),roomno nvarchar(10),id int identity)
    if object_id('Room')is not null drop table Room
    go
    create table Room(RoomNo nvarchar(10),LightNum int)insert Light
    select 'a01','a' union
    select 'a02','a' union
    select 'a03','a' union
    select 'b01','b' union
    select 'b02','b' union
    select 'c01','c' insert room
    select 'a',3 union all
    select 'b',2 union all
    select 'c',1 
    go
    CREATE TRIGGER UpdateRoom_LightNum_DelTri ON Light
    AFTER DELETE 
    AS
    DECLARE    @RoomNo nvarchar(10),@LightNum int,@LightNo nvarchar(10)Select @LightNo = LightNo from DELETED
    Select @RoomNo = RoomNo from  DELETED Where LightNo = @LightNo 
    BEGIN
        Update Room Set LightNum = LightNum - 1 Where RoomNo = @RoomNo
    END
    goif object_id('DelLightRecord') is not null drop proc DelLightRecord
    go
    CREATE PROCEDURE DelLightRecord --创建视图
    (
        @LightNo nvarchar(10)
    )
    AS
    Declare @ReturnValue bit 
    BEGIN TRANSACTION Del_LightRecord    --开始执行事务IF @LightNo NOT IN (SELECT LightNo FROM Light) --判断表里面是否有该条记录
        BEGIN    ROLLBACK TRANSACTION Del_LightRecord    SET @ReturnValue = 0
        RETURN @ReturnValue      END
    ELSE             --否则,执行修改另一个表的记录
        BEGIN
        DELETE  FROM Light WHERE LightNo=@LightNo    COMMIT TRANSACTION Del_LightRecord     --提交事务    SET @ReturnValue = 1
        RETURN @ReturnValue      END
    select  @LightNo=@@Identity
    GO--
    DECLARE @RC int
    DECLARE @LightNo nvarchar(10)
    -- 设置参数值
    set @LightNo='a01'
    EXEC @RC = [master].[dbo].[DelLightRecord] @LightNo
    select @rc
    select * from room/*(所影响的行数为 6 行)
    (所影响的行数为 3 行)
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)            
    ----------- 
    1(所影响的行数为 1 行)RoomNo     LightNum    
    ---------- ----------- 
    a          2
    b          2
    c          1(所影响的行数为 3 行)
    */
      

  10.   

    我已经把这一句去掉了!
    完全改成了最简单的代码,。也就是chuifengde
     提供的代码,但是还是不行!还是出现相同的错误!
      

  11.   

    --取存储过程return的值
    declare @s int 
    exec @s=DelLightRecord '108'
    select @s
      

  12.   

     
               if (myCommand.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("数据添加成功!");
                    initLightNo();
                    LoadData();
                }
                else
                {
                    MessageBox.Show("数据添加失败!");
                }我监视了程序,返回值竟然是2!难怪我最后总是执行数据添加失败!可是为什么会返回2呢?
    哥们姐们能不能解释一下?
      

  13.   

    myCommand.ExecuteNonQuery()那要看你的执行了,
    而且你触发器那样写肯定不行的,如果同时删除多条会出错
      

  14.   

    这是我程序的删除代码。大家看看是否有问题?        private void vbtnDelete_Click(object sender, EventArgs e)
            {
                try
                {
                    int flag;
                    SqlConnection myConnection = G_SqlExecute.GetCon();
                    SqlCommand myCommand = new SqlCommand("DelLightRecord", myConnection);                //指明sql的操作类型是存储过程
                    myCommand.CommandType = CommandType.StoredProcedure;                string tmp = txtLightNo.Text;
                    //给存储过程添加参数
                    SqlParameter para1 = new SqlParameter("@LightNo", SqlDbType.NVarChar, tmp.Length);
                    para1.Value = tmp;
                    myCommand.Parameters.Add(para1);                if (MessageBox.Show("确定要删除该数据吗?", "删除数据", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        flag = myCommand.ExecuteNonQuery();
                        if (flag == 1)
                        {
                            MessageBox.Show("数据删除成功!");
                            LoadData();
                        }
                        else
                        {
                            MessageBox.Show("数据删除失败!");
                        }
                    }
                    myConnection.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
      

  15.   

    ExecuteNonQuery()执行完这个系统自带的函数之后,flag为2,这我就不明白了。所以它老是执行数据删除失败!可是数据库里面的值有删除!!!!!
      

  16.   

    分享一下我的测试代码:C#调用存储过程 返回值,输出参数,返回结果集 
    http://blog.csdn.net/xys_777/archive/2010/06/21/5684442.aspx
    调试存储过程
    http://blog.csdn.net/xys_777/archive/2010/06/18/5678190.aspx
      

  17.   

    系统自带的函数ExecuteNonQuery(),是存储过程的返回值
      

  18.   

    前 些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 。但是实际上并不是这样的,好在处理的数据操作多时 修改, 插入, 删除,否则的话问题就有点打了,都是些基础的知识,但是很重要个人觉得有必要记下来。     ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对 于 Update,Insert,Delete  语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们 平时的思维方式有点差距所以应该好好的注意了,例如对数据库共添加一个数据表的Create操作,当创建数据表成功时返回-1,如果操作失败的话(如数据 表已经存在)往往会发生异常,所以执行这种操作时最好用try--catch--语句来容错。
      例如用ExecuteNonQuery()方法执行create操作
            SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=PSDB;Integrated Security=SSPI");string str = "CREATE TABLE aaa ( " +
    "[ID] [int] IDENTITY (1, 1) NOT NULL , " +
    "[BasicID] [int] NULL ," +
    "[AdoptedName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
    "[AdoptedSex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ," +
    "[AdoptBirthday] [smalldatetime] NULL ," +
    "[AdoptedType] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ," +
    "[ApprTime] [smalldatetime] NULL ," +
    "[Re] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL " +
    ") ON [PRIMARY]   ";       SqlCommand comm = new SqlCommand(str, conn);
    int i = 10;
    try
    {
    conn.Open();
    i = comm.ExecuteNonQuery();
    conn.Close();
    }
    catch (Exception ex)
    {
    Response.Write(ex.Message);
    }        Response.Write(i.ToString());       如果执行成功的话 返回的值为-1,如果数据表已经存在的话返回异常:数据库中已存在名为 'aaa' 的对象。问题已经解决!给分~虽然不是SQL的问题,但是让我意识到有些程序写得过于复杂,其实实现起来很简单!还有一些就是理解错了!比如二楼说的,触发器有问题deleted是结果集怎么可以赋给变量!!!
    终究还是学到了点东西!谢谢各位高手!谢谢大哥,谢谢大姐!