错误信息:异常详细信息: System.IndexOutOfRangeException: 索引超出了数组界限。错误行:行 206: myCommand.Parameters[cols[i]].Value = colvalue;

解决方案 »

  1.   

    整理了一下,容易读些:
    private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
              String updateCmd = "update Department set dept_id = @dept_id,dept_name = @dept_name,manager = @manager where dept_id = @dept_id";
              SqlCommand myCommand = new SqlCommand(updateCmd,mysqlConnection); myCommand.Parameters.Add(new SqlParameter("@dept_id",SqlDbType.VarChar,2));
    myCommand.Parameters.Add(new SqlParameter("@dept_name",SqlDbType.VarChar,10));
    myCommand.Parameters.Add(new SqlParameter("@manager",SqlDbType.VarChar,8));

             myCommand.Parameters["@dept_id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];         Response.Write(updateCmd);
    String[] cols = {"@dept_id","@dept_name","@manager"}; int numCols = 0;
    numCols = e.Item.Cells.Count;
    for (int i=3; i<numCols; i++)  //跳过第一、第二、第三列
    {
       String colvalue = ((TextBox)e.Item.Cells[i].Controls[0]).Text; //检查在所需字段中是否有空值
       if (i<5 && colvalue == "")
       {
         Message.Text = "错误:'部门编号'、'部门名称'不允许使用空值!";
         Message.Style["color"] = "red";
         return;
       }
    Response.Write(myCommand);
    myCommand.Parameters[cols[i]].Value = colvalue;
    }
    mysqlConnection.Open(); try
    {
       myCommand.ExecuteNonQuery();
       Message.Text = "已更新记录!";
       DataGrid1.EditItemIndex = -1;
    }
    catch (SqlException exc)
    {
       if (exc.Number == 2627)
          Message.Text = "错误:已存在具有相同主键的记录!";
       else
          Message.Text = "错误:未能更新记录,请确保正确填写了字段!";  
       Message.Style["color"] = "red";
    } mysqlConnection.Close(); sqlDataAdapter1.Fill(mydataSet,"Department");
    BindGrid();
    }
      

  2.   

    cols数组定义的范围是0-2,但是你使用的时候,myCommand.Parameters[cols[i]].Value = colvalue中,明显i值是大于2的。
    出错的是cols的索引,而不是Parameters。
      

  3.   

    i 的值为3,将cols[i]改成cols[i-3]
    myCommand.Parameters[cols[i-3]].Value = colvalue
    这回可以pass,不报错了,
    但运行完后,值不能更新,库中也没有更新,
    可调试时跟踪的值都对呀,why???
      

  4.   

    看看myCommand.ExecuteNonQuery()的返回值,可以得到影响的记录数。
      

  5.   

    int i = myCommand.ExecuteNonQuery();
    Response.Write(i.ToString());
      

  6.   

    Response.Write(i.ToString());
    返回的i值为0.
    so strange??好象myCommand.ExecuteNonQuery();没有起作用呀?
      

  7.   

    不一定是没有起作用,而可能是没有找到任何匹配行可更新,所以返回值为0,最好在执行ExecuteNonQuery()方法前监测一下updateCmd的值,
    设一个临时的string tempsql = updateCmd;设置断点很快就知道原因了
      

  8.   

    我跟踪的时候,myCommand.Parameters[cols[i-3]].Value = colvalue
    中的cols[i-3]的值都在变呀,怎么会更新不了呢?
      

  9.   

    跟踪最终形成的updateCmd字符串...
      

  10.   

    1、在你open之前的那句,把myCommand打印出来,直接paste到sqlserver的analyzer里面,看看是什么内容?
    2、在execute的时候,把你自己的处理代码屏蔽掉,直接throw出来exc,然后看看他的stack trace。我给你发一份我总结的调试的一些技巧,你看看。
      

  11.   

    myCommand 放到 sql server中的analyzer里,运行结果如下:myCommand :   System.Data.SqlClient.SqlCommand
    结果:        命令已成功完成。updateCmd 放到 sql server中的analyzer里,运行结果如下:updateCmd :  update Department set dept_id = @dept_id,dept_name = @dept_name,manager = @manager where dept_id = @dept_id结果:  服务器: 消息 137,级别 15,状态 2,行 1
             必须声明变量 '@dept_id'。
    可是我的程序中这句声明了'@dept_id'呀, why?  
    myCommand.Parameters["@dept_id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
      

  12.   

    myCommand.Parameters["@dept_id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
    或许是这一句有什么错误吧。
    Response.Write输出DataGrid1.DataKeys[(int)e.Item.ItemIndex]看看。
      

  13.   

    加了句
    Response.Write(DataGrid1.DataKeys[(int)e.Item.ItemIndex]);
    运行结果:(int)e.Item.ItemIndex 6 int应该对呀, 可为什么不能更新呢?
      

  14.   

    修改好的程序我发给你了,你进步很大,不过,代码实现让我看着冒火!!!你得sqlAdapter1,mydataSet都是全局的,为什么还要在每个method中重新new一次?!看得我直发晕,里面至少三分之一的代码要删除掉。
      

  15.   

    angel 搞定了就揭贴
    没有也说句话
    免得各位大哥(不包括我)在这里转来转去
      

  16.   

    非常感谢大家的帮助!刚刚解决:)
    前两天不在,又忙的没时间解决它,现在真的很开心:))icyer帮我解决了本贴的问题
    juqiang帮我解决了更新的问题原因:应该对原始记录进行更新操作,改动了三个地方:1、where dept_id = @ori_dept_id  对原记录操作
    2、myCommand.Parameters.Add(new SqlParameter("@ori_dept_id",SqlDbType.VarChar,2));  定义参数
    3、myCommand.Parameters["@ori_dept_id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex]; 定位要更新的值