急,在线等:System.IndexOutOfRangeException: 索引超出了数组界限

Spm_psh 2007-09-26 02:17:30
公共类的代码:
//定义完成注册相关常量表示字段名称或SQL语句。
private const string SQL_UPDATE_USERPASS = "dbo.proUpdateUserpass";
private const string PARM_USERPASS_NAME = "@username";
private const string PARM_USERPASS_PASS = "@userpass";

/// <summary>
/// 更新用户密码
/// </summary>
/// <param name="username">用户名称</param>
/// <param name="userpass">用户密码</param>
public static bool UpdateUserpass(string username, string userpass)
{
StringBuilder strSQL = new StringBuilder();
//获取缓存参数,如果没有,此方法会自动创建缓存列表
SqlParameter[] passParms = GetParameters();
//创建执行语句的SQL命令
SqlCommand cmd = new SqlCommand();
//依次给参数赋值
passParms[0].Value = username;
passParms[1].Value = userpass;

//遍历所有参数,并将参数添加到SqlCommand命令中
foreach (SqlParameter parmPass in passParms)
cmd.Parameters.Add(parmPass);

//获取数据库的连接字符串
using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringLocalTransaction))
{
//打开数据库连接,执行命令
conn.Open();
//设置Sqlcommand命令的属性
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "dbo.proUpdateUserpass";
//执行添加的SqlCommand命令
int val = cmd.ExecuteNonQuery();
//清空SqlCommand命令中的参数
cmd.Parameters.Clear();
//关闭数据库连接
conn.Close();

//判断添加是否成功
if (val > 0)
{
return false;
}
else
{
return true;
}
}
}
private static SqlParameter[] GetParameters()
{
SqlParameter[] parmsPass = SqlHelper.GetCachedParameters(SQL_UPDATE_USERPASS);

//首先用户密码判断缓存是否已经存在
if (parmsPass == null)
{
//缓存不存在的情况下,新建参数列表
parmsPass = new SqlParameter[]{
new SqlParameter(PARM_USERPASS_NAME, SqlDbType.NVarChar, 50),
new SqlParameter(PARM_USERPASS_PASS, SqlDbType.NVarChar, 128)};

//将新建的参数列表添加到哈希表中缓存起来
SqlHelper.CacheParameters(SQL_UPDATE_USERPASS, parmsPass);
}

//返回参数数组
return parmsPass;
}

完成注册的页面:
protected void Button1_Click(object sender, EventArgs e)
{
//将密码转换为UTF-8
byte[] pass = Encoding.UTF8.GetBytes(tbPassword.Text);
//计算UTF-8编码的字节数组的MD5哈希值,再转换为字符串
MD5 md5 = new MD5CryptoServiceProvider();
string strPass = Encoding.UTF8.GetString(md5.ComputeHash(pass));
string strName = Request.QueryString["name"];

if (Page.IsValid)
{
if (RpcHomsinPublic.UpdateUserpass(strName, strPass))
{
returnMessage.Text = "注册成功!";
}
else
{
returnMessage.Text = "注册失败!";
}
}
}
各位大虾都帮忙看看,问题到底出在哪儿啊。我已经遇到过几次这种错误了,老是提示索引超出了数组界限;顺便问问,数组到底有什么界限啊?
...全文
5984 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spm_psh 2007-09-28
  • 打赏
  • 举报
回复
调试过了。就是说索引数组超出了界限,但是代码并没有问题啊。添加用户的SP?
密码更新的方式,就是第一个页面只填用户名。然后把用户名传至下一个页面(完善用户信息),根据用户名来匹配完成其它项的填写,这样不行吗???
kaishui_gu 2007-09-28
  • 打赏
  • 举报
回复
密码更新的方式,完成用户注册--------这样可以吗?
你应该加一个添加用户的SP
brooklyng60 2007-09-27
  • 打赏
  • 举报
回复
public static bool UpdateUserpass(string username, string userpass)
{
StringBuilder strSQL = new StringBuilder();
//获取缓存参数,如果没有,此方法会自动创建缓存列表
SqlParameter[] passParms = GetParameters();
//依次给参数赋值
passParms[0].Value = username;
passParms[1].Value = userpass;
int val=SQLHelper.ExecuteNonQuery(SqlHelper.ConnectionStringLocalTransaction,CommandType.StoredProcedure,SQL_UPDATE_USERPASS,passParms)
//判断添加是否成功
if (val > 0)
{
return false;
}
else
{
return true;
}
试下
}
}
whw123456 2007-09-27
  • 打赏
  • 举报
回复
断点、跟踪调试··
liusong_china 2007-09-27
  • 打赏
  • 举报
回复
学习
混沌骑士 2007-09-27
  • 打赏
  • 举报
回复
路过 。。检查数组大小
kaishui_gu 2007-09-27
  • 打赏
  • 举报
回复
没用过SqlHelper,将
private static SqlParameter[] GetParameters()
{
SqlParameter[] parmsPass = SqlHelper.GetCachedParameters(SQL_UPDATE_USERPASS);

//首先用户密码判断缓存是否已经存在
if (parmsPass == null)
{
//缓存不存在的情况下,新建参数列表
parmsPass = new SqlParameter[]{
new SqlParameter(PARM_USERPASS_NAME, SqlDbType.NVarChar, 50),
new SqlParameter(PARM_USERPASS_PASS, SqlDbType.NVarChar, 128)};

//将新建的参数列表添加到哈希表中缓存起来
SqlHelper.CacheParameters(SQL_UPDATE_USERPASS, parmsPass);
}

//返回参数数组
return parmsPass;
}
改成
private static SqlParameter[] GetParameters()
{
return new SqlParameter[]{
new SqlParameter(PARM_USERPASS_NAME, SqlDbType.NVarChar, 50),
new SqlParameter(PARM_USERPASS_PASS, SqlDbType.NVarChar, 128)};
}
}

试试
symbol441 2007-09-27
  • 打赏
  • 举报
回复
new SqlParameter(PARM_USERPASS_PASS, SqlDbType.NVarChar, 128)};
----------------------------------------------------------------

改为
new SqlParameter(PARM_USERPASS_PASS, SqlDbType.NVarChar, 130)};
问题应该可以解决
cyy1981 2007-09-27
  • 打赏
  • 举报
回复
把断点设置在这个地方 //返回参数数组
return parmsPass;

看看parmsPass 有几个值,按你的exception看lenth肯定是1
winuser 2007-09-27
  • 打赏
  • 举报
回复
调试下
zhuqueta0101 2007-09-27
  • 打赏
  • 举报
回复
单看代码是看不出问题的,你断点跟一下,多跟几次,明显是获得数组大小出错了,你看是哪修改了,那个passParms.Length是保护出错,还是要加的
leer168 2007-09-27
  • 打赏
  • 举报
回复
学习
vfan2010 2007-09-27
  • 打赏
  • 举报
回复
这样的问题应该debug一下。
Spm_psh 2007-09-27
  • 打赏
  • 举报
回复
我试了你们提的方法,页面没有出错,但没有反应。数据库也没有更新。难道是我大意,存储过程写错了;现列出来大家帮忙参详一下,谢谢!
描述:因我是采用密码更新的方式,完成用户注册,所以这个存储过程不复杂。[格式由SQL2005自动生成]
ALTER PROCEDURE [dbo].[proUpdateUserpass]
@username nvarchar (50),
@userpass nvarchar (130)
AS
BEGIN
SET NOCOUNT ON;
UPDATE userinfo SET password = @userpass
WHERE xxixiv = @username
RETURN 1
END
Spm_psh 2007-09-27
  • 打赏
  • 举报
回复
谢谢各位大虾。偶去试试。
conannb 2007-09-27
  • 打赏
  • 举报
回复
学习
photoplan 2007-09-26
  • 打赏
  • 举报
回复
代码看了好几遍,没发现任何错误。是不是代码里其他地方用同一个键缓存参数了。
liuyun1987 2007-09-26
  • 打赏
  • 举报
回复
断点跟踪~~~~~~~~~~~~~~~~
peng_hai_lin 2007-09-26
  • 打赏
  • 举报
回复
设置断点,跟踪调试!
zhuqueta0101 2007-09-26
  • 打赏
  • 举报
回复
你最好检查一下
SqlParameter[] parmsPass = SqlHelper.GetCachedParameters(SQL_UPDATE_USERPASS);
这句获得的大小对不对
加载更多回复(17)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧