none
编写的SQL储存过程无法执行并列的IF...ELSE.... RRS feed

  • 问题

  • 大家好,我需要同时操作一个数据库中的3个表,故我编写了一个存储过程,采用并列的三个IF...ELSE....来分别操作这三个表,存储过程的形式如下:

    CREATE PROCEDURE [dbo].[UpdateUserInfo]
    @UpdateStatus varchar(10),
    @UpdateTime datetime,
    @AUTHORITY_ID INT
    
    AS 
    BEGIN
    	IF (expresson1)
    		begin
    			--如果包含,更新相关信息			
    			UPDATE  	第一个Table的一行数据
    		end
    	ELSE
    		begin
    		-- 如果不包含,就增加一条记录			
    			INSERT INTO  第一个Table一行数据
    		end
    	
    
    	IF(expression2)	
    		BEGIN
    			--如果已经包含,就更新这个USER_ID这一行
    			UPDATE 第二个Table的一行数据
    		END
    	ELSE
    		BEGIN
    			--不包含就在USER_TO_ORGANIZATION表中插入一条新记录
    			INSERT  第二个Table一行数据
    		END
    		
    
    	IF(expression3)
    		BEGIN
    			--如果已经包含了,就更新这一行
    			UPDATE 第三个Table的一行数据
    		END
    	ELSE
    		BEGIN
    			--如果不包含就在ORGANIZATION_INFO表中插入一条新记录
    			INSERT 第三个Table一行数据
    		END
    END
    就包含Update和INSERT这两种命令,不再包含其他命令。

    然后我就用ExecuteNonQuery调用这个存储过程,但每次只有第一个IF...ELSE....块执行了,后面的两个没有执行啊,这是什么原因啊?

    因为是连接的远程服务器上是SQL Server,并需要定时更新,故我先尽可能少的连接。





    2014年12月10日 9:43

答案

  • 请问你可以调式你写的存储过程吗?建议你最好去调式下,这样可以缩小问题的范围。如果单独调试存储过程没有问题,那么久可以确定问题是发生在项目里了。

    对于抛出的问题,貌似只是给出了出错的方法,但是没有给出说明,你单独看下ex.Message或者把里面信息贴出来,先不看ex.StackTrace


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 waterharbin 2014年12月16日 14:51
    2014年12月12日 9:28
    版主

全部回复

  • Hello waterharbin,

    >>然后我就用ExecuteNonQuery调用这个存储过程,但每次只有第一个IF...ELSE....块执行了,后面的两个没有执行啊,这是什么原因啊?

    是否有错误发生在第一个If else模块呢,建议楼主用一个try catch来尝试能否捕捉到错误:

    http://msdn.microsoft.com/en-us/library/ms175976.aspx

    既然你可以部署存储过程到数据库,那你应该有权限操作数据库的吧,如果是的话,建议你在数据库端直接调式这段存储过程,给的参数就相当于你在projectcall 这段存储过程给的一样的就可以了,这里有个SQL Sever 2008的例子,你可以参考下:

    http://blogs.msdn.com/b/billramo/archive/2009/04/11/transact-sql-debugger-for-sql-server-2008-part-1.aspx

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2014年12月11日 2:55
    版主
  • 你好,Fred Bao

    如果我把后面的两个IF...ELSE....块注释掉,只保留第一个IF...ELSE....的话,这个存储过程不出现任何问题,且达到了预期效果啊。我调用这个存储过程的代码如下:

    public class SqlDbManipulation
        {

    /// <param name="commandText">要执行的SQL语句</param>
            /// <param name="commandType">要执行的查询语句的类型,如存储过程或者SQL文本命令</param>
            /// <param name="parameters">Transact-SQL 语句或存储过程的参数数组</param>
            /// <returns>返回执行操作受影响的行数</returns>
            public int ExecuteNonQuery(string commandText,
                CommandType commandType, SqlParameter[] parameters)
            {
                int count = 0;
                try {
                    using (SqlConnection connection = new SqlConnection(connString)) {
                        using (SqlCommand command = new SqlCommand(commandText, connection)) {
                            command.CommandType = commandType;//设置command的CommandType为指定的CommandType
                            //如果同时传入了参数,则添加这些参数
                            if (parameters != null) {
                                foreach (SqlParameter parameter in parameters) {
                                    command.Parameters.Add(parameter);
                                }
                            }
                            connection.Open();//打开数据库连接
                            count = command.ExecuteNonQuery();
                        }
                    }
                } catch (Exception ex) {
                    Debug.Assert(false, ex.StackTrace + ex.Message);
                }

                return count;//返回执行增删改操作之后,数据库中受影响的行数
            }

    }

    然后再定义一个静态类ConnectionManager,定义一个静态成员:public static SqlDbManipulation SqlManipulation,以直接调用这个方法ConnectionManager.SqlManipulation.ExecuteNonQuery(),而不用在定义实例了。

    但一调用就抛出的异常,但这个异常好像看不懂啊,如下图:




    2014年12月11日 11:08
  • 请问你可以调式你写的存储过程吗?建议你最好去调式下,这样可以缩小问题的范围。如果单独调试存储过程没有问题,那么久可以确定问题是发生在项目里了。

    对于抛出的问题,貌似只是给出了出错的方法,但是没有给出说明,你单独看下ex.Message或者把里面信息贴出来,先不看ex.StackTrace


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 waterharbin 2014年12月16日 14:51
    2014年12月12日 9:28
    版主