Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#在asp.net中执行SQL Server 2008存储过程/游标时出错?_Asp.net_Sql Server 2008_Stored Procedures_Cursor - Fatal编程技术网

使用C#在asp.net中执行SQL Server 2008存储过程/游标时出错?

使用C#在asp.net中执行SQL Server 2008存储过程/游标时出错?,asp.net,sql-server-2008,stored-procedures,cursor,Asp.net,Sql Server 2008,Stored Procedures,Cursor,你好,这是我写的第一个游标程序 我很惊讶地看到,在成功地影响了我的过程中的表行之后,出现了错误,我想使用这个过程来执行这些操作 我正在为该职位分配菜单,当我从特定职位删除某些菜单时,我需要更新(添加/删除)属于该职位的所有员工的菜单。下面的过程执行所有操作,但我得到一个错误: 错误:数据库中已存在名为“EmployeeMenuMst”的对象 执行后 存储过程是: ALTER PROCEDURE [sUpdateEmpMenuMst] (@EmployeePostID INT) AS BE

你好,这是我写的第一个游标程序

我很惊讶地看到,在成功地影响了我的过程中的表行之后,出现了错误,我想使用这个过程来执行这些操作

我正在为该职位分配菜单,当我从特定职位删除某些菜单时,我需要更新(添加/删除)属于该职位的所有员工的菜单。下面的过程执行所有操作,但我得到一个错误:

错误:数据库中已存在名为“EmployeeMenuMst”的对象

执行后

存储过程是:

ALTER PROCEDURE [sUpdateEmpMenuMst]
    (@EmployeePostID INT)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @EMPID INT
    DECLARE @EMPMENUID INT

    BEGIN TRAN
    BEGIN TRY
    DECLARE EmployeeTable CURSOR FOR

    SELECT EmployeeID FROM EMPLOYEEMST WHERE EmployeePostID=@EmployeePostID

    OPEN EmployeeTable

    FETCH NEXT FROM EmployeeTable INTO @EMPID
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DELETE FROM EmployeeMenuMst WHERE EmployeeID=@EMPID  

    FETCH NEXT FROM EmployeeTable INTO @EMPID
    END
    CLOSE EmployeeTable
    DEALLOCATE EmployeeTable

        SELECT   EmployeeMst.EmployeeID, EmployeePostMenuMst.MenuID, EmployeePostMenuMst.AccessLevelID,1 AS ISVISIBLE
        INTO EmployeeMenuMst
        FROM     EmployeePostMenuMst 
        INNER JOIN EmployeeMst 
        ON EmployeePostMenuMst.EmployeePostID = EmployeeMst.EmployeePostID
        WHERE EmployeeMst.EMPLOYEEPOSTID=@EmployeePostID ORDER BY EmployeeMst.EMPLOYEEID
        COMMIT TRAN
    END TRY

    BEGIN CATCH
        ROLLBACK TRAN
        IF @@TRANCOUNT > 0
        DECLARE @ErrMsg nvarchar(4000), @ErrSeverity INT
        SELECT @ErrMsg = ERROR_MESSAGE(),
        @ErrSeverity = ERROR_SEVERITY()
        RAISERROR(@ErrMsg, @ErrSeverity, 1)

    END CATCH

   END
GO
在代码隐藏
aspx.cs
文件中:

private void UpdateMenus()
    {
        SqlCommand cmd = new SqlCommand();
        SqlConnection con = new SqlConnection(conStr);
        try
        {
            con.Open();
            cmd.CommandText = "sUpdateEmpMenuMst";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@EmployeePostID", Convert.ToInt32(Session["postID"]));
            cmd.Connection = con;
            int i = cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            con.Close();
        }
        finally
        {
            con.Close();
        }
    }
错误出现在
ExecuteNonQuery
行。为什么它会抛出一个错误-有什么想法吗

在获得错误后,行将以我需要的方式成功地受到影响

谢谢你的帮助

SELECT   EmployeeMst.EmployeeID, EmployeePostMenuMst.MenuID, EmployeePostMenuMst.AccessLevelID,1 AS ISVISIBLE
        INTO EmployeeMenuMst
将尝试创建表EmployeeMenuMst ans fill ist,可能您正在搜索

Insert into EmployeeMenuMst
SELECT   EmployeeMst.EmployeeID, EmployeePostMenuMst.MenuID, EmployeePostMenuMst.AccessLevelID,1 AS ISVISIBLE

“EmployeeMenuMst”是否在每次运行过程时创建?如何将受影响行的值返回到代码隐藏文件中的ExecuteOnQuery。现在代码运行良好,但我到达这里-即使在影响行之后也有1的值。@ SkkHaStEt听起来是一个不同的问题-请考虑打开一个单独的/搜索这里,因为BuMMI已经回答了你原来的问题。K谢谢@ BuMMI回答我已经修改了以上查询现在它工作得很好!