DataGrid问题!不能更新数据库!?

lyo 2003-03-22 10:26:06
string UpdateCmd="update liren set id=@id,name=@name,title=@title,statement=@statement,time=@time";
SqlCommand sqlCmd=new SqlCommand(UpdateCmd,sqlConnection1);
sqlCmd.Parameters.Add(new SqlParameter("@id",SqlDbType.Int,4));
sqlCmd.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar,50));
sqlCmd.Parameters.Add(new SqlParameter("@title",SqlDbType.VarChar,100));
sqlCmd.Parameters.Add(new SqlParameter("@statement",SqlDbType.Text,16));
sqlCmd.Parameters.Add(new SqlParameter("@time",SqlDbType.DateTime,8));

sqlCmd.Parameters["@id"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];
string[] colvalue={"@id","@name","@title","@statement","@time"};
int numCols=e.Item.Cells.Count;
for(int i=3;i<numCols-1;i++)
{
string tableCmd=((TextBox)e.Item.Cells[i].Controls[0]).Text;
sqlCmd.Parameters[numCols-1].Value=colvalue;
}
sqlCmd.Connection.Open();
sqlCmd.ExecuteNonQuery();
Message.Text="<b>已更新纪录</b><br>"+UpdateCmd;
DataGrid1.EditItemIndex=-1;
sqlCmd.Connection.Close();
SqlDataAdapter sda=new SqlDataAdapter("select * from liren",sqlConnection1);
DataSet ds=new DataSet();
sda.Fill(ds,"liren");
DataGrid1.DataSource=ds.Tables["liren"].DefaultView;
DataGrid1.DataBind();
在TextBox中修改完数据后,一点击update,就出错:“ System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名:index
” 行 164: sqlCmd.Parameters["@id"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];
可我并没有超出int id字段的长度啊?!
谁能帮我看看哪里错了?多谢!
...全文
108 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhugeliang 2003-03-27
  • 打赏
  • 举报
回复
//请参考
public void My_DataGrid_Update(Object sender,DataGridCommandEventArgs E)
{
try
{
string My_Update_Comm_Str = "UPDATE "+Table_Name+" SET "+Department_id+" = ?, " +
Department_name+" =? ,"+Department_function+" =? "+
" Where "+Department_id+" =?;";

OleDbCommand My_Update_Comm = new OleDbCommand(My_Update_Comm_Str, My_Conn);
OleDbParameter id = new OleDbParameter("id",OleDbType.VarChar, 40);
OleDbParameter name = new OleDbParameter("name",OleDbType.VarChar, 40);
OleDbParameter fun = new OleDbParameter("fun",OleDbType.VarChar, 256);
OleDbParameter oid = new OleDbParameter("oid",OleDbType.VarChar, 40);
My_Update_Comm.Parameters.Add(id);
My_Update_Comm.Parameters.Add(name);
My_Update_Comm.Parameters.Add(fun);
My_Update_Comm.Parameters.Add(oid);
My_Update_Comm.Parameters["oid"].Value =My_DataGrid.DataKeys[(int)E.Item.ItemIndex];
String[] Cols = {"id","name","fun"};
int NumCols = E.Item.Cells.Count;
string ColValue;
for (int i=2; i<NumCols; i++) //第0列是‘编辑‘列,第1列是‘删除‘列
{
ColValue = ((TextBox)E.Item.Cells[i].Controls[0]).Text;
My_Update_Comm.Parameters[Cols[i-2]].Value = ColValue;
}
My_Update_Comm.Connection.Open();
My_Update_Comm.ExecuteNonQuery();
My_DataGrid.EditItemIndex = -1;
My_Update_Comm.Connection.Close();
query_all();
My_DataGrid.CurrentPageIndex=0;
BindGrid();
}
catch
{ //出错处理-部门信息重复
Response.Write(@"<script language=javaScript>alert('对不起,部门信息重复!');</script>");
}
}
lyo 2003-03-27
  • 打赏
  • 举报
回复
我把代码和数据库简化了一下,还是不行!
点击完update后数值仍复原,一点不变!我的全部代码如下:
//////////////////html部分///////////////////////////////////////
<html>
<head>
</head>
<body bgcolor="#ccffff">
<form runat="server">
<p>
<asp:DataGrid id="DataGrid1" runat="server" OnUpdateCommand="MyUpdate" OnCancelCommand="MyCancel" OnEditCommand="MyEdit" OnPageIndexChanged="PageIndexChanged" PageSize="6" AllowPaging="True" HorizontalAlign="Center" ForeColor="Black" GridLines="None" CellPadding="2" BackColor="LightGoldenrodYellow" BorderColor="Tan" BorderWidth="1px">
<FooterStyle backcolor="Tan"></FooterStyle>
<HeaderStyle font-bold="True" backcolor="Tan"></HeaderStyle>
<PagerStyle horizontalalign="Center" forecolor="DarkSlateBlue" backcolor="PaleGoldenrod" pagebuttoncount="4"></PagerStyle>
<SelectedItemStyle forecolor="GhostWhite" backcolor="DarkSlateBlue"></SelectedItemStyle>
<AlternatingItemStyle backcolor="PaleGoldenrod"></AlternatingItemStyle>
<Columns>
<asp:EditCommandColumn EditText="Edit" CancelText="Cancel" UpdateText="Update" />
</Columns>
</asp:DataGrid>
</p>
<p>
<asp:Button id="Button1" onclick="Button1_Click" runat="server" Text="NewPost"></asp:Button>
</p>
<!-- Insert content here -->
</form>
</body>
</html>
////////////////////////////////////cs部分////////////////////////////////////
void page_load(Object sender, EventArgs e) {

string sCom="select * from testIn";
//SqlConnection sCon=new SqlConnection("server=qijiashe;uid=sa;pwd=;database=testxml");
//if(!IsPostBack)
Bind();
}

void Bind(){
SqlConnection sCon=new SqlConnection("server=qijiashe;uid=sa;pwd=;database=testxml");
string sCom="select * from testIn";
SqlDataAdapter sda=new SqlDataAdapter(sCom,sCon);
DataSet ds=new DataSet();
sda.Fill(ds);
DataView source=new DataView(ds.Tables[0]);
DataGrid1.DataSource=source;
DataGrid1.DataBind();

}

System.Data.DataSet MyQueryMethod(string name, string title, string statement) {
string connectionString = "server=\'localhost\'; trusted_connection=true; Database=\'testxml\'";
System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString);

string queryString = "SELECT [testIn].[name], [testIn].[title], [testIn].[statement] FROM [testIn] WHER" +
"E (([testIn].[name] = @name) AND ([testIn].[title] = @title) AND ([testIn].[stat" +
"ement] = @statement))";
System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(queryString, sqlConnection);

sqlCommand.Parameters.Add("@name", System.Data.SqlDbType.VarChar).Value = name;
sqlCommand.Parameters.Add("@title", System.Data.SqlDbType.VarChar).Value = title;
sqlCommand.Parameters.Add("@statement", System.Data.SqlDbType.VarChar).Value = statement;

System.Data.SqlClient.SqlDataAdapter dataAdapter = new System.Data.SqlClient.SqlDataAdapter(sqlCommand);
System.Data.DataSet dataSet = new System.Data.DataSet();
dataAdapter.Fill(dataSet);

return dataSet;
}

void Button1_Click(Object sender, EventArgs e) {
Response.Redirect("TestIn.aspx");
}

void PageIndexChanged(Object source, DataGridPageChangedEventArgs e) {
DataGrid1.CurrentPageIndex=e.NewPageIndex;
DataGrid1.DataBind();
}

void MyCancel(Object source, DataGridCommandEventArgs e) {
DataGrid1.EditItemIndex=-1;
DataGrid1.DataBind();
}

void MyEdit(Object source, DataGridCommandEventArgs e) {
DataGrid1.EditItemIndex=e.Item.ItemIndex;
DataGrid1.DataBind();
}

void MyUpdate(Object source, DataGridCommandEventArgs e) {
if(!IsPostBack){
string command="update testIn set id=@id,name=@name,title=@title,statement=@statement where id=@newid";
SqlConnection conn=new SqlConnection("server=qijiashe;uid=sa;pwd=;database=testxml");
SqlCommand sqlcom=new SqlCommand(command,conn);
sqlcom.Parameters.Add(new SqlParameter("@newid",SqlDbType.Int,4));
sqlcom.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar));
sqlcom.Parameters.Add(new SqlParameter("@title",SqlDbType.VarChar));
sqlcom.Parameters.Add(new SqlParameter("@statement",SqlDbType.VarChar));
sqlcom.Parameters["@newid"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];
string[] volu={"@id","@name","@title","@statement"};
int colu=e.Item.Cells.Count;
for(int i=2;i<colu-1;i++)
{
string colue=((TextBox)e.Item.Cells[i].Controls[0]).Text;
sqlcom.Parameters[volu[i-1]].Value=colue;
}
string sCom="select * from testIn";
sqlcom.Connection.Open();
sqlcom.ExecuteNonQuery();
DataGrid1.EditItemIndex=-1;
sqlcom.Connection.Close();
}
Bind();
}
谁能告诉我是哪里的错?!!多谢!弄了好几天了也没找出任何错误!郁闷~~
jackyspy 2003-03-27
  • 打赏
  • 举报
回复
这好像是一个很奇怪的问题,我也曾经碰到过,不是DataKeyFields设置的问题,虽然没有在程序代码中明确的像“DataGrid1.DataKeyfields=数据库表里的主键”这样赋值,但是在DataGrid的属性面板里面有设置,对应的aspx编译成cs文件的时候有这样的赋值语句,所以并不是这里的问题。更奇怪的是我出现这个错误以后并没有更改任何代码,就设置断点调试(在这之前我已经编译过,所以不会是修改程序之后没有编译的问题),执行到这里的时候发现结果居然是对的!继续运行,没有报错!然后退出调试模式,在ie里面直接执行,发现这一次运行的结果完全正确!!所以这个问题也就不了了之了,至今都没有找出问题的所在,反正程序运行结果没有问题,我也无从下手了。
zhugeliang 2003-03-27
  • 打赏
  • 举报
回复
兄弟,刚才我把
DataGrid1.DataKeyfields=数据库表里的主键
去掉,错误和你一样,赶快加上,一切OK
glboy 2003-03-23
  • 打赏
  • 举报
回复
给你个参考:

//==============================================================================
//功能 : 执行指定的SQL语句
//参数 : 要执行的Sql语句
//返回值 : 1:执行成功;0:执行失败
//==============================================================================
public int ExeSql(string Sql)
{
SqlConnection myConnection = new SqlConnection(this.ConnectionString);
SqlCommand myCommand=new SqlCommand(Sql,myConnection);
try
{
myConnection.Open();
myCommand.ExecuteNonQuery();
myCommand.Dispose();
myConnection.Close();
return 1;
}
catch(SqlException e)
{
errMsg = "";
errMsg += e.Message;
myConnection.Close();
return 0;
}
}

再加上你的SQL语句就可以了。
你只要将你的int和datetime这两个对应字段做个数据类型转换就可以提交了
lyo 2003-03-23
  • 打赏
  • 举报
回复
to supnet:
警告只有“g:\inetpub\wwwroot\WebApplication3\main.aspx.cs(183): 声明了变量“de”,但从未使用过“但我认为这和我的错误无关吧。
to jsljy:
从我的代码可以看出我给他付值了吧,有没有什麽方法在运行的时候察看“sqlCmd.Parameters["@id"].Value”的值?对了,我的Table为:id,name,title,statement,time
time为datetime型。还是没找到是那里的错,请指点!
jsljy 2003-03-23
  • 打赏
  • 举报
回复
sqlCmd.Parameters["@id"].Value=DataGrid1.DataKeys[(int)e.Item.ItemIndex];
你有没有看付值给sqlCmd.Parameters["@id"].Value的值 是多少吗?可能你没有
把数据传用去呢,“需要参数 @id,但未提供该参数”这句话我觉得是没有把数据传进去
supnet 2003-03-23
  • 打赏
  • 举报
回复
检查看看当“Build”是否已经“警告”??往往这里出现“警告”而你继续执行时就会报这样错误!
philins 2003-03-23
  • 打赏
  • 举报
回复
你可以到MSDN上看一下微软写的文档,关于SQL SERVER数据库更新的,对照着看一下。
lyo 2003-03-23
  • 打赏
  • 举报
回复
up!
lhfeng 2003-03-23
  • 打赏
  • 举报
回复
e.Item.ItemIndex没有返回正确的数值。
你可以把他写到一个文本框里,检查数值是否正确。
lyo 2003-03-23
  • 打赏
  • 举报
回复
Up!
lyo 2003-03-23
  • 打赏
  • 举报
回复
多谢楼上各位!我把sqlCmd.Parameters[numCols-1].Value=colvalue; 这句改为“sqlCmd.Parameters[colvalue[i-1]].Value=tableCmd; "本以为没问题了,不过改过来还是不行!又说:“被准备语句 '(@id int,@name varchar(50),@title varchar(100),@statement text,@' 需要参数 @id,但未提供该参数。 ”行 188: sqlCmd.ExecuteNonQuery();
可我明明提供了id这个参数啊!请各位指点!
philins 2003-03-22
  • 打赏
  • 举报
回复
还有你的UpDateCmd不太对呀?你要更新哪条记录啊?最后最好加上where查询
littlethree 2003-03-22
  • 打赏
  • 举报
回复
up
philins 2003-03-22
  • 打赏
  • 举报
回复
你的DataKeyfields定义了吧?单看这一句的话,好像应该没有错误,C#不太懂
http://expert.csdn.net/Expert/topic/1563/1563762.xml?temp=.514599
这是我才问的,用VB写的,那里倒是没有问题,你可以参考看看
glboy 2003-03-22
  • 打赏
  • 举报
回复
没人回复啊,呵呵,我不是很熟悉ASP.NET,根据经验,
应该就是这出的错:
DataGrid1.DataKeys[(int)e.Item.ItemIndex];

不然你可以先直接使用一个int变量值来做测试,看是否可以通过?

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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