我也碰到一个问题,
就是说用DATAGRID 的时候,点击更新,就发生错误:索引超出范围。必须为非负值并小于集合大小。参数名: index 
行 54:         strSql = "Update link Set sitename='" & txtSiteName.Text & "',URL='" & txtURL.Text & "',intro='" & txtIntro.Text & "',grade=" & CInt(txtGrade.Text) & ",submit_date=#" & Now() & "# Where link_id=" &  myDataGrid.DataKeys(CInt(E.Item.ItemIndex))放在数据库中也没什么问题求救

解决方案 »

  1.   

    拼接SQL语句永远是不安全的做法。
    如果你的txtUrl中带有',你的语句就玩完了。
      

  2.   

    to: hangzjj(中家斗)
        "Now()" 换为DateTime.Now 试试
      

  3.   

    '单击更新时,执行该事件过程。
        Sub MyDataGrid_Update(ByVal Sender As Object, ByVal E As DataGridCommandEventArgs) Handles myDataGrid.UpdateCommand
            '建立Connection对象
            Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("wwwlink.mdb"))
            '建立Command对象
            Dim txtSiteName, txtURL, txtIntro, txtGrade As TextBox       '声明文本框控件变量
            txtSiteName = E.Item.Cells(2).Controls(0)
            txtURL = E.Item.Cells(3).Controls(0)
            txtIntro = E.Item.Cells(4).Controls(0)
            txtGrade = E.Item.Cells(5).Controls(0)
            Dim strSql As String
            strSql = "Update link Set sitename='" & txtSiteName.Text & "',URL='" & txtURL.Text & "',intro='" & txtIntro.Text & "',grade=" & CInt(txtGrade.Text) & ",submit_date=#" & DateTime.Now() & "# Where link_id=" & myDataGrid.DataKeys(CInt(E.Item.ItemIndex))
            Dim cmd As New OleDbCommand(strSql, conn)
            '执行更新操作
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()
            '重新绑定
            myDataGrid.EditItemIndex = -1
            Call BindData()
        End Sub
      

  4.   

    to : hangzjj(中家斗) 
    不好意思,没看见你写的错误 :"索引超出范围。必须为非负值并小于集合大小"
    这个错误应该不是COMMAND的问题,可能是“myDataGrid.DataKeys(CInt(E.Item.ItemIndex))”有问题to: 楼主
    不好意思,不知你的问题是否解决?没有的话,把代码那出来,大家研究一下
      

  5.   

    public bool UpdateBook(BookInfo book)
    {
    bool bResult = false;
    if (book == null) return bResult; 
    bResult = true; string connectstring = ApplicationConnectString.ConnectString;
    OleDbConnection conn = new OleDbConnection(connectstring);
    conn.Open(); OleDbCommand command = new OleDbCommand();
    command.Connection = conn; string commandText = "UPDATE Book SET BOOKCODE =";
    commandText = book.BookCode == null ? commandText + "null," : commandText + "'" + book.BookCode + "',BOOKNAME = ";
    commandText = book.BookName == null ? commandText + "null," : commandText + "'" + book.BookName + "',AUTHOR = ";
    commandText = book.Author == null ? commandText + "null," : commandText + "'" + book.Author + "',ISSUER = ";
    commandText = book.Issuer == null ? commandText + "null," : commandText + "'" + book.Issuer + "',CONTENT = ";
    commandText = book.Content == null ? commandText + "null," : commandText + "'" + book.Content + "',POSITION = ";
    commandText = book.Position == null ? commandText + "null" : commandText + "'" + book.Position + "',RKTIME = ";
    commandText = commandText+ "'" + book.RKTime + "'";
    commandText += " where bookid =" + book.BookID; command.CommandText = commandText;
    try
    {
    command.ExecuteNonQuery();
    }
    catch(Exception e)
    {

    bResult = false;
    throw(e);

    } conn.Close();
    return bResult;
    }
      

  6.   

    我Update几乎表结构一样的一张表,就没有这个问题!真实奇怪!
      

  7.   

    你update是利用sqladapter自动生成的update语句?还是自己写的command的update语句??
    建议请贴出代码。
      

  8.   

    strSql = "Update link Set sitename='" & txtSiteName.Text & "',URL='" & txtURL.Text & "',intro='" & txtIntro.Text & "',grade=" & CInt(txtGrade.Text) & ",submit_date=#" & Now() & "# Where link_id=" &  myDataGrid.DataKeys(CInt(E.Item.ItemIndex))将myDataGrid.DataKeys(CInt(E.Item.ItemIndex))换成一个固定值看看会不会报:"索引超出范围。必须为非负值并小于集合大小"错误?将commandText换一句最简单的语句会否报错误?
      

  9.   

    commandText += " where bookid =" + book.BookID
    改为commandText += " where bookid ='" + book.BookID+"'"
      

  10.   

    To yuwen16(rr):
    我Update另外一张表就没有报错,那张表的结构和Book表几乎一样!另外我数据库是用的access,所以查错的手段比较少(也许有,我不知道)To fellowcheng(头都编大了):
    Bookid是一个int型的,应该不会是你所说的问题大家有没有人碰到过类似的情况,最后解决的?
    我现在总结一下我的问题:
    1.直接用程序Update,抛出错误“Update语句语法错误”
    2.跟踪进去,把SQL语句提取出来,不做任何改动,直接在数据库中执行,是ok的
    3.我update另外一个表,语句也是这么写的,没有问题!
    4.我真的很郁闷,从来没有碰到过这种问题!
      

  11.   

    所以,我建议楼主
    直接将commandText 的值换成一句最简单的sql语句
    比如update table set filed = 'xx'来看看哦。
    一般来说语法错误都是sql的问题。
    如果你是自动生成的command的话,才有可能是系统生成代码和你数据库不对应造成。
    不过你是用一个command来做的,应该不会有这问题。
    如你用commandtext最简单的语句代替还是有这问题的话,那就不清楚了。。