注册 登录
编程论坛 SQL Server论坛

(出错求救)为过程或函数 IndexTree_Delete 指定的参数太多

wangzhen_andy 发布于 2008-10-03 20:28, 3039 次点击
今天用DbHelper进行数据库的操作,编了几行代码。运行时出错如下:
未处理的“System.Exception”类型的异常出现在 SubwayPreplan.exe 中。

其他信息: 为过程或函数 IndexTree_Delete 指定的参数太多。

相关代码:
public void Delete(int ID)
        {

            int rowsAffected;
            SqlParameter[] parameters = {
                    new SqlParameter("@ID", SqlDbType.BigInt,8),    
                    new SqlParameter("@Title", SqlDbType.VarChar,50),
                };
            parameters[0].Value = ID;
            parameters[1].Value = Title;
            DbHelperSQL.RunProcedure("IndexTree_Delete", parameters, out rowsAffected);
        }
private void btndeleteNode_Click(object sender, EventArgs e)
        {
            clsIndexTree.ID = int.Parse(txtNodeId.Text);
            clsIndexTree.Title = txtNodeName.Text;
            clsIndexTree.Delete(clsIndexTree.ID);
            MessageBox.Show("编辑成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

小弟出学者,不知道怎样改,请大家指教!!
15 回复
#2
jz84172008-10-03 22:02
这个

不懂
楼下回答
我是菜鸟。。。
#3
wangzhen_andy2008-10-03 23:00
第一次发帖,你是第一个回复,还是谢谢啦。。。。
#4
bygg2008-10-04 12:14
public void Delete(int ID)方法中只需要一个参数,但是parameters[1].Value = Title;中的Title是哪里来的?

而引用时clsIndexTree.Delete(clsIndexTree.ID);我觉得没错的.
#5
球球2008-10-04 12:55
public bool Delete(clsIndexTree)//这里具体的是你的(实体 实例名)        
        {
            int rowsAffected;
            SqlParameter[] parameters = {
                    new SqlParameter("@ID", SqlDbType.BigInt,8),   
                    new SqlParameter("@Title", SqlDbType.VarChar,50),
                };
            parameters[0].Value = clsIndexTree.ID;
            parameters[1].Value = clsIndexTree.Title;
            DbHelperSQL.RunProcedure("IndexTree_Delete", parameters, out rowsAffected);
        }
private void btndeleteNode_Click(object sender, EventArgs e)
        {
            clsIndexTree.ID = int.Parse(txtNodeId.Text);
            clsIndexTree.Title = txtNodeName.Text;
            clsIndexTree.Delete(clsIndexTree)
            MessageBox.Show("编辑成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }
如果clsIndexTree是实体对象,就用传对象的方式来传参,数据库存储过程里的输入参数应该有两个:ID,Title
clsIndexTree.Delete最好是返回bool值,通过判断来确实是否编辑成功。

[[it] 本帖最后由 球球 于 2008-10-4 12:58 编辑 [/it]]
#6
wangzhen_andy2008-10-04 13:13
谢谢各位的大力支持,我会继续努力的,将代码进行到底!!
#7
wangzhen_andy2008-10-04 13:40
回复bygg:我把Title相关的那两个语句注释掉了,运行出现错误,显示
未处理的“System.Exception”类型的异常出现在 SubwayPreplan.exe 中。

其他信息: @ID 不是过程 IndexTree_Delete 的参数。
想不明白了,我看的例程里的delete函数都是这样子写的。用DBHelper生成的那些代码不都是一样的吗?

回复球球:我按照您的意思修改了程序,但是结果还是出错,错误信息和原来的一样,参数过多。

其实我也是拿着师兄的程序,帮忙修改,他form里面的delete没有实现,我帮忙写的,真的不行就开学再去问问师兄了。。。。
#8
球球2008-10-04 14:23
编辑肯定是要传Title的,不然光传ID能编辑什么呢?你看下你的存储过程里是怎么写的?存储过程里应该有两个输入参数才对,通过ID来修改Title。
#9
球球2008-10-04 14:28
问一下你这里的存储过程IndexTree_Delete 是操作什么功能的?是删除一条信息吗?
#10
球球2008-10-04 14:40
把你的IndexTree_Delete存储过程贴上来就知道是哪里的原因了。
根据你的DbHelperSQL.RunProcedure("IndexTree_Delete", parameters, out rowsAffected);
应该把连接数据库的字符串单独提取出来传入到方法里:
DbHelperSQL.RunProcedure(DbHelperSQL.StrConn, "IndexTree_Delete", parameters, out rowsAffected);
DbHelperSQL.StrConn连接在方法里用完之后立即关闭,不知道你的DbHelperSQL类是如何写的?
可能你的DbHelperSQL已经做了处理,我这里只是建议一下。
#11
wangzhen_andy2008-10-04 15:53
#region 存储过程操作

        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>SqlDataReader</returns>
        public static SqlDataReader RunProcedure(string storedProcName, IDataParameter[] parameters)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlDataReader returnReader;
            connection.Open();
            SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
             = CommandType.StoredProcedure;
            returnReader = command.ExecuteReader();
            return returnReader;
        }


        /// <summary>
        /// 执行存储过程
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <param name="tableName">DataSet结果中的表名</param>
        /// <returns>DataSet</returns>
        public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet dataSet = new DataSet();
                connection.Open();
                SqlDataAdapter sqlDA = new SqlDataAdapter();
                sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
                sqlDA.Fill(dataSet, tableName);
                connection.Close();
                return dataSet;
            }
        }


        /// <summary>
        /// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
        /// </summary>
        /// <param name="connection">数据库连接</param>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>SqlCommand</returns>
        private static SqlCommand BuildQueryCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
        {
            SqlCommand command = new SqlCommand(storedProcName, connection);
             = CommandType.StoredProcedure;
            foreach (SqlParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }
            return command;
        }

        /// <summary>
        /// 执行存储过程,返回影响的行数        
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <param name="rowsAffected">影响的行数</param>
        /// <returns></returns>
        public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                int result;
                try
                {
                    connection.Open();
                    SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
                    rowsAffected = command.ExecuteNonQuery();
                    result = (int)command.Parameters["ReturnValue"].Value;
                    //Connection.Close();
                    return result;
                }
                catch (System.Data.SqlClient.SqlException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    connection.Close();
                }
            }
        }

        /// <summary>
        /// 创建 SqlCommand 对象实例(用来返回一个整数值)    
        /// </summary>
        /// <param name="storedProcName">存储过程名</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns>SqlCommand 对象实例</returns>
        private static SqlCommand BuildIntCommand(SqlConnection connection, string storedProcName, IDataParameter[] parameters)
        {
            SqlCommand command = BuildQueryCommand(connection, storedProcName, parameters);
            command.Parameters.Add(new SqlParameter("ReturnValue",
                SqlDbType.Int, 4, ParameterDirection.ReturnValue,
                false, 0, 0, string.Empty, DataRowVersion.Default, null));
            return command;
        }
        #endregion

    }

这个好像是用那个DBHelper的软件自动生成的吧。具体我也不太明白里面的操作。你帮我看一下吧。
#12
球球2008-10-04 18:58
这个类没错呀,是要看你的存储过程是怎么写的,从你的存储过程名称来看好象是删除操作,不是更新操作,如果编辑的话应该是更新操作。
#13
球球2008-10-04 19:02
更新的话,应该是要传多个参数的。删除只传ID。所以你程序里改过来了,存储过程没改还是报参数过多的异常。
#14
wangzhen_andy2008-10-04 21:06
是啊,我是根据更新的那个函数自己修改出来的删除操作,我DBHelper里的存储操作的那个过程看不是太懂。我看那些个添加操作,更新操作只是前面的部分不一样,后面都是调用的RunProcedure(),那个语句是一样的,我就这样写了。

我DBHelper里面的那些函数操作都不是很明白,不知道有没有什么相关的资料呢?
#15
球球2008-10-05 00:50
这些都是.net数据层的基本东西呀,好好看下C#基础书就知道了。
#16
wangzhen_andy2008-10-05 01:18
好的,谢啦
1