你是不是加了“READ ONLY”。

解决方案 »

  1.   

    老兄,那叫游标,不叫光标,你学数据库师从哪一位高手啊。我想你误解了游标的意思,你可以这样认为:游标是一个临时表,它里面放着你用做游标的字段。你只能读取,不能修改。但你是可以修改它的原始表的。省略掉“SCROLL”时,为仅向前游标,也可以遍历。
      

  2.   

    建议减少使用 Cusor 。
    这是一个SQL SERVER 2000提供的可以update cusor模版
    -- =============================================
    -- Declare and using an UPDATE cursor
    -- =============================================
    DECLARE <@variable_1, sysname, @v1> <datatype_for_variable_1, sysname, varchar(20)>, 
    <@variable_2, sysname, @v2> <datatype_for_variable_2, sysname, varchar(40)>DECLARE <cursor_name, sysname, test_cursor> CURSOR 
    FOR SELECT <column_1, sysname, au_fname>, <column_2, sysname, au_lname> FROM <table_name, sysname, pubs.dbo.authors>
    FOR UPDATE of <column_1, sysname, au_fname>DECLARE @count smallint
    SELECT @count = 1OPEN <cursor_name, sysname, test_cursor>
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO <@variable_1, sysname, @v1>, <@variable_2, sysname, @v2>WHILE (@@fetch_status <> -1)
    BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
    -- PRINT 'add user-defined code here...'
    -- eg
    PRINT 'updating record of ' + @v1 + ' ' + @v2
    UPDATE pubs.dbo.authors
    SET au_fname = @v1 + '-' + CAST(@count AS varchar(4))
    WHERE au_lname = @v2
    END
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO <@variable_1, sysname, @v1>, <@variable_2, sysname, @v2>
    SELECT @count = @count + 1
    ENDCLOSE <cursor_name, sysname, test_cursor>
    DEALLOCATE <cursor_name, sysname, test_cursor>
    GO
      

  3.   

    这是一个例子
    -- =============================================
    -- Declare and using an UPDATE cursor
    -- =============================================
    DECLARE <@variable_1, sysname, @v1> <datatype_for_variable_1, sysname, varchar(20)>, 
    <@variable_2, sysname, @v2> <datatype_for_variable_2, sysname, varchar(40)>DECLARE <cursor_name, sysname, test_cursor> CURSOR 
    FOR SELECT <column_1, sysname, au_fname>, <column_2, sysname, au_lname> FROM <table_name, sysname, pubs.dbo.authors>
    FOR UPDATE of <column_1, sysname, au_fname>DECLARE @count smallint
    SELECT @count = 1OPEN <cursor_name, sysname, test_cursor>
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO <@variable_1, sysname, @v1>, <@variable_2, sysname, @v2>WHILE (@@fetch_status <> -1)
    BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
    -- PRINT 'add user-defined code here...'
    -- eg
    PRINT 'updating record of ' + @v1 + ' ' + @v2
    UPDATE pubs.dbo.authors
    SET au_fname = @v1 + '-' + CAST(@count AS varchar(4))
    WHERE au_lname = @v2
    END
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO <@variable_1, sysname, @v1>, <@variable_2, sysname, @v2>
    SELECT @count = @count + 1
    ENDCLOSE <cursor_name, sysname, test_cursor>
    DEALLOCATE <cursor_name, sysname, test_cursor>
    GO
      

  4.   

    但是如果不加scroll的话,fetch就不能执行first,last,
    加了scroll以后,就告诉我cursor is read only,可是我没有加过read only 属性