愁呀!datagrid的更新总是出错,可错在哪呢? 错误信息:异常详细信息: System.IndexOutOfRangeException: 索引超出了数组界限。错误行:行 206: myCommand.Parameters[cols[i]].Value = colvalue; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 整理了一下,容易读些: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();} cols数组定义的范围是0-2,但是你使用的时候,myCommand.Parameters[cols[i]].Value = colvalue中,明显i值是大于2的。出错的是cols的索引,而不是Parameters。 i 的值为3,将cols[i]改成cols[i-3]myCommand.Parameters[cols[i-3]].Value = colvalue这回可以pass,不报错了,但运行完后,值不能更新,库中也没有更新,可调试时跟踪的值都对呀,why??? 看看myCommand.ExecuteNonQuery()的返回值,可以得到影响的记录数。 int i = myCommand.ExecuteNonQuery();Response.Write(i.ToString()); Response.Write(i.ToString());返回的i值为0.so strange??好象myCommand.ExecuteNonQuery();没有起作用呀? 不一定是没有起作用,而可能是没有找到任何匹配行可更新,所以返回值为0,最好在执行ExecuteNonQuery()方法前监测一下updateCmd的值,设一个临时的string tempsql = updateCmd;设置断点很快就知道原因了 我跟踪的时候,myCommand.Parameters[cols[i-3]].Value = colvalue中的cols[i-3]的值都在变呀,怎么会更新不了呢? 跟踪最终形成的updateCmd字符串... 1、在你open之前的那句,把myCommand打印出来,直接paste到sqlserver的analyzer里面,看看是什么内容?2、在execute的时候,把你自己的处理代码屏蔽掉,直接throw出来exc,然后看看他的stack trace。我给你发一份我总结的调试的一些技巧,你看看。 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]; myCommand.Parameters["@dept_id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];或许是这一句有什么错误吧。Response.Write输出DataGrid1.DataKeys[(int)e.Item.ItemIndex]看看。 加了句Response.Write(DataGrid1.DataKeys[(int)e.Item.ItemIndex]);运行结果:(int)e.Item.ItemIndex 6 int应该对呀, 可为什么不能更新呢? 修改好的程序我发给你了,你进步很大,不过,代码实现让我看着冒火!!!你得sqlAdapter1,mydataSet都是全局的,为什么还要在每个method中重新new一次?!看得我直发晕,里面至少三分之一的代码要删除掉。 angel 搞定了就揭贴没有也说句话免得各位大哥(不包括我)在这里转来转去 非常感谢大家的帮助!刚刚解决:)前两天不在,又忙的没时间解决它,现在真的很开心:))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]; 定位要更新的值 Fck错误 Asp.net怎么更新文本框,在线结贴. 关于SqlDataSource控件的几个问题 girdview中的gridview1_RowUpdating 更新不成功也不报错搞了半天也没成效 我是新手 请大家帮忙找原因 文件上传遇到的奇怪问题 asp.net文章系统??? 如何判断输入的值是英文+字母,而不是中文或其它呢? Asp.net问题简单,帮助解决问题送100分 Help!--ASP.NET配置错误?!?!?! 关于datareader的奇怪问题!困扰了我一个晚上了!请大家帮忙! [公告]:注意事项 SNK问题。
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();
}
出错的是cols的索引,而不是Parameters。
myCommand.Parameters[cols[i-3]].Value = colvalue
这回可以pass,不报错了,
但运行完后,值不能更新,库中也没有更新,
可调试时跟踪的值都对呀,why???
Response.Write(i.ToString());
返回的i值为0.
so strange??好象myCommand.ExecuteNonQuery();没有起作用呀?
设一个临时的string tempsql = updateCmd;设置断点很快就知道原因了
中的cols[i-3]的值都在变呀,怎么会更新不了呢?
2、在execute的时候,把你自己的处理代码屏蔽掉,直接throw出来exc,然后看看他的stack trace。我给你发一份我总结的调试的一些技巧,你看看。
结果: 命令已成功完成。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];
或许是这一句有什么错误吧。
Response.Write输出DataGrid1.DataKeys[(int)e.Item.ItemIndex]看看。
Response.Write(DataGrid1.DataKeys[(int)e.Item.ItemIndex]);
运行结果:(int)e.Item.ItemIndex 6 int应该对呀, 可为什么不能更新呢?
没有也说句话
免得各位大哥(不包括我)在这里转来转去
前两天不在,又忙的没时间解决它,现在真的很开心:))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]; 定位要更新的值